三年写了两本书,这是我的时间管理实践
“听说你出了两本书,说说你现在是什么感觉。”
“感觉啊,感觉就像是坐了三年牢,终于放出来。”
在Python中,如果要判断一个字符串是否在另一个字符串里面,我们可以使用in
关键字,例如:
1 | >>> a = '你说我是买苹果电脑,还是买windows电脑呢?' |
如果有多个句子和多个关键字,那么可以使用for
循环来实现:
1 | sentences = ['你说我是买苹果电脑,还是买windows电脑呢?', |
运行效果如下图所示:
现在如果有100000000个句子,有1000个关键字,那么你需要对比1000亿次才能全部查询完成。这个时间代价太大了,如果Python一秒钟能运行500万次查询(实际上没有这么快),那么1000亿次查询需要20000秒,接近6小时。而且,由于in
关键字的时间复杂度为O(n)
,如果有大量长句子,查询时间会更长。
这篇文章没有代码,请放心阅读。
程序员最宝贵的东西是生命,生命属于程序员只有一次。一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为搭建环境浪费时间而悔恨,也不会因为集群无法运行而羞耻。这样,在她开发的时候,她能够说:“我的整个生命和全部精力,都已经献给了开发中最重要的事情——设计程序,实现程序和调Bug。” ——P酱。
P酱是公司新来的实习生妹子。听说是一个文科生。文科生应该会去文案组或者策划组吧。什么?来数据组?让我来带?
于是我和P酱生活工作在了一起。
有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现。
先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行Javascript代码,就能轻轻松松识别你是否使用了Selenium + Chromedriver模拟浏览器。
我们来看一个例子。
大家经常在一些博客中看到这样的说法:
1 | a += 1 |
等价于
1 | a = a + 1 |
这种说法实际上并不准确。
我们来看一个例子:
1 | >>> a = [1, 2, 3] |
这里报错了,说明a += b
和a = a + b
并不是完全等价的。
在使用Airtest超快速开发App爬虫文章的最后,我们留了一个尾巴:如何启动Airtest的无线模式,不用USB线就能控制手机?
本文将会讲到具体的做法。做法分为两种:第一种是在Airtest的IDE中控制手机。第二种是在Python代码里面控制远程手机。
想开发网页爬虫,发现被反爬了?想对 App 抓包,发现数据被加密了?不要担心,使用 Airtest 开发 App 爬虫,只要人眼能看到,你就能抓到,最快只需要2分钟,兼容 Unity3D、Cocos2dx-*、Android 原生 App、iOS App、Windows Mobile……。
在Python中,你可能会发现这样一个奇怪的现象:
1 | >>> 2 == 2 > 1 |
为什么会出现2 == 2 > 1
的结果为True
?如果说这是运算符的优先级问题,那么后两个式子为什么又都是False
?
实际上这涉及到了Python的链式对比(Chained Comparisons)
。在其他语言中,有一个变量x
,如果要判断x是否大于1,小于5,可能需要这样写代码:
1 | if (1 < x and x < 5) |
但是在Python中,可以这样写代码:
1 | if 1 < x < 5 |
Python能够正确处理这个链式对比的逻辑。
回到最开始的问题上,==
等于符号和<
小于符号,本质没有什么区别。所以实际上2==2>1
也是一个链式对比的式子,它相当于2==2 and 2>1
。此时,这个式子就等价于True and True
。所以返回的结果为True。
关于链式对比,可以看官方文档:https://docs.python.org/3/reference/expressions.html#comparisons
2018年,我的第一本书出版了。
离开北京,来到到杭州,加入了网易游戏伏羲人工智能实验室。
在这一年里面,一共看完了21本书:
在LeetCode刷了九十多题:https://github.com/kingname/LeetCode
写了13篇博客。
2019年1月,我的第二本书即将出版。
2019年新年目标:
在《跳出任务管理的泥沼,拥抱甘特图的怀抱》一文中,我谈到了使用甘特图来规划任务。甘特图更多的关注每一个任务的进度上。那么如果我希望了解项目整体的进度,应该如何选择呢?此时就需要引入另一个简单又强大的工具:燃尽图(Burn down chart)。