最近reddit有个热帖:Senior Python Programmers, what tricks do you want to impart to us young guns? 很多python老鸟分享了自己的奇巧淫技(也不算特别淫),让我学到不少经验和技巧,觉得有必要整理一下。
尽量使用Python3.6,相比Python2.7,Python3.6有了很多提升,比如enums和fstring(实话说,就算只为了fstring我也要换到3.6)。
无比赞同,最近俺们公司的项目也都换到Python3.6了,俺之前写了个git-ext小工具,也随手升级到Python3.6了。
使用.open()和.close()的代码是“有味道”的,尽量使用with代码块(俺写的with文章)。
关于什么是“有味道的代码”,下面有人给出了回复:
有味道的代码指的是,当你去看这块代码的时候,看不出有什么错,但其实是有bug的……简单说就是欠优化的代码。wiki
每一个项目都使用virtualenv,不要在系统的Python上安装任何东西。这样可以保持产品环境独立、可复制。不使用virtualenv就像生活在垃圾场一样。
推荐pipsi,让每一个python工具使用一个独立的env,推荐virtualenv wapper,创建、使用、删除virtualenv从未如此简单。当然下面也有网友推荐了pipenv。
使用csv模块来处理CSV文件…… 网友调侃此条说:就是有人喜欢手工处理CSV,“CSV而已,我用逗号分割就好了”成了他们最后的遗言。
不要嵌套生成器表达式,不然代码难以阅读(此条来自Google style guide)。
我觉得嵌套两层尚可。
如果你在循环的时候需要下标,使用enumerate(items)。
如果你用IDE编程,花点时间去学习它的features,特别是如何使用debugger,如何设置断点。
同意,Vim还是IDE,并不重要,重要的是去掌控你的武器。
multiprocessing,而不是threading。
不同意这点,要看情况,反对任何形式的教条主义。俺最近在翻译一本Python并行编程书,大家可以去看看。
用REPL开发特别方便,比如iPython和Jupyter。优点是可以方便地跳转和编辑运行,还有很多魔术方法。如果你经常用REPL的话,还可以试试ptpython和bpython。
理解解包,比如多重赋值: first, second, *_ = (1,2,3,4)。
避免使用 *args和**kwargs,这会让代码更难读,也会让代码自动补全无法工作。除非你确信自己需要这么做。下面有网友支持,即使你需要这样使用,也并不一定使用这两个名字。比如sum(*numbers)就比sum(*args)要好很多,虽然标准库里面用的*args。
这里提一下,Python3已经支持”keyword-only” argument了,如下:
def compare(a, b, *, case_insensitive=False, locale_aware=False)
在所有写代码的地方使用lint工具,例如pyflakes或pylint。它们会强迫你成为更好的程序员。
其实这一条争议比较大,有一规则个人认为比较死板,比如testcase的函数名应该尽量长并且表达出你要测试什么,因为这些test函数永远不会被程序员调用所以长一点也无所谓。另外80个字符也是比较烦。一开始用是好的,但是用了很长时间还需要lint来规范你就不太好了。手中无刀,心中有刀。(Vim用户推荐一下neomake,异步不阻塞)
当你有什么需求的时候,先check一下标准库有没有你想要的东西,如果没找到……再找一遍。还是没找到的话,就去第三方库找一找(有时候github的搜索框比Google还好用)。Python有比较好的生态,大多数痛点都已经有人做了。
itertools和fuctools是你的好朋友,两个模块对一些常见的问题提供了实用的工具。总之,你对标准库越熟悉,你处理问题的方法就会越清晰、越pythonic。
Understand the decorator. Become the decorator.
好吧这句话无法翻译出来意境,之前写过这篇文章,对理解装饰器帮助很大,可以参考一下。
不要称你自己是个Python程序员,不然如果换了一种语言,你就什么也不是了。称自己为“系统工程师”或“Python开发者”或“自动化专家”。
之前我总是不断打开命令行,载入自己写的模块,测试程序。后来我改变了开发模式,先写一个小的单元测试,然后以后开发只通过运行这个测试来调试。即使这个测试并没有真正assert,只有简单的打印。(欢迎加入TDD)
学习单元测试。当你发现你的代码太长,目的不明确的时候,就需要重构了。写出可测试的、清晰的代码。函数应该有明确的目的,入口和返回值。
经常重构代码。这是你让已经工作的代码变得更好的机会。
变量名字使用单词。Good:counter, probe, product; Bad: c, cnt, prb, prdct, obj
理解生成器。尽可能用它。
并不是所有的东西都必须是class。https://www.youtube.com/watch?v=o9pEzgHorH0
尽可能使用absolute import。
理解Python的线程,GIL和multiprocessing
熟悉asyncio。
永远不要用list(任何可变对象都不要用)作为参数默认值。
(foo=[])
It’s not about how complicated you can make it, but how simple you can make it.
谢谢分享~
哈哈哈哈哈哈哈 谢谢捧场
为了方便的使用CUDA 和tensorflow-GPU, 目前用的py3.5
Excellent Choice! 大多数库都要放弃支持Python2了,Python3是趋势。