前言
python 是一门简单而优雅的语言,可能是过于简单了,不用花太多时间学习就能使用,其实 python 里面还有一些很好的特性,能大大简化你代码的逻辑,提高代码的可读性。
所谓Pythonic,就是极具Python特色的Python代码(明显区别于其它语言的写法的代码)
关于 pythonic,你可以在终端打开 python,然后输入 import this,看看输出什么,这就是 Tim Peters 的 《The Zen of Python》,这首充满诗意的诗篇里概况了 python 的设计哲学,而这些思想,其实在所有语言也基本上是通用的
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea – let's do more of those!
使用生成器 yield
生成器是 python 里面一个非常有用的语法特性,却也是最容易被忽视的一个,可能是因为大部分能用生成器的地方也能用列表吧。
生成器可以简单理解成一个函数,每次执行到 yield 语句就返回一个值,通过不停地调用这个函数,就能获取到所有的值,这些值就能构成了一个等效的列表,但是与列表不同的是,这些值是不断计算得出,而列表是在一开始就计算好了,这就是 lazy evaluation 的思想。这个特性在数据量特别大的场景非常有用,比如大数据处理,一次无法加载所有的文件,使用生成器就能做到一行一行处理,而不用担心内存溢出
def fibonacci(): num0 = 0 num1 = 1 for i in range(10): num2 = num0 + num1 yield num2 num0 = num1 num1 = num2for i in fibonacci(): print(i)
用 else 子句简化循环和异常
if / else 大家都用过,但是在 python 里面,else 还可以用在循环和异常里面
# pythonic 写法for cc in ['UK', 'ID', 'JP', 'US']: if cc == 'CN': breakelse: print('no CN')# 一般写法no_cn = Truefor cc in ['UK', 'ID', 'JP', 'US']: if cc == 'CN': no_cn = False breakif no_cn: print('no CN')
else 放在循环里面的含义是,如果循环全部遍历完成,没有执行 break,则执行 else 子句
新闻热点
疑难解答