python 是一門簡單而優雅的語言,多是過於簡單了,不用花太多時間學習就能使用,其實 python 裏面還有一些很好的特性,能大大簡化你代碼的邏輯,提升代碼的可讀性python
關於 pythonic,你能夠在終端打開 python,而後輸入 import this
,看看輸出什麼,這就是 Tim Peters 的 《The Zen of Python》,這首充滿詩意的詩篇裏概況了 python 的設計哲學,而這些思想,其實在全部語言也基本上是通用的git
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!
生成器是 python 裏面一個很是有用的語法特性,卻也是最容易被忽視的一個,多是由於大部分能用生成器的地方也能用列表吧。github
生成器能夠簡單理解成一個函數,每次執行到 yield 語句就返回一個值,經過不停地調用這個函數,就能獲取到全部的值,這些值就能構成了一個等效的列表,可是與列表不一樣的是,這些值是不斷計算得出,而列表是在一開始就計算好了,這就是 lazy evaluation 的思想。這個特性在數據量特別大的場景很是有用,好比大數據處理,一次沒法加載全部的文件,使用生成器就能作到一行一行處理,而不用擔憂內存溢出編程
def fibonacci(): num0 = 0 num1 = 1 for i in range(10): num2 = num0 + num1 yield num2 num0 = num1 num1 = num2 for i in fibonacci(): print(i)
if / else
你們都用過,可是在 python 裏面,else
還能夠用在循環和異常裏面app
# pythonic 寫法 for cc in ['UK', 'ID', 'JP', 'US']: if cc == 'CN': break else: print('no CN') # 通常寫法 no_cn = True for cc in ['UK', 'ID', 'JP', 'US']: if cc == 'CN': no_cn = False break if no_cn: print('no CN')
else
放在循環裏面的含義是,若是循環所有遍歷完成,沒有執行 break
,則執行 else
子句less
# pythonic 寫法 try: db.execute('UPDATE table SET xx=xx WHERE yy=yy') except DBError: db.rollback() else: db.commit() # 通常寫法 has_error = False try: db.execute('UPDATE table SET xx=xx WHERE yy=yy') except DBError: db.rollback() has_error = True if not has_error: db.commit()
else
放到異常裏面能夠表示,若是沒有異常發生須要執行的操做ide
咱們都知道,打開的文件須要在用完以後關閉,要不就會形成資源泄露,可是實際編程的時候常常會忘記關閉,特別是在一些邏輯複雜的場景中,更是如此,python 有一個優雅地解決方案,那就是 with
子句函數
# pythonic 寫法 with open('pythonic.py') as fp: for line in fp: print(line[:-1]) # 通常寫法 fp = open('pythonic.py') for line in fp: print(line[:-1]) fp.close()
使用 with as
語句後,無需手動調用 fp.close()
, 在做用域結束後,文件會被自動 close 掉,完整的執行過以下:學習
open('pythonic.py')
,返回的一個對象 obj
,obj.__enter__()
方法,返回的值賦給 fp
with
中的代碼塊obj.__exit__()
obj.__exit__()
,若是 obj.__exit__()
返回 False
, 異常將被繼續拋出,若是返回 True
,異常被掛起,程序繼續運行列表推導
[expr for iter_var in iterable if cond_expr]
生成器表達式
(expr for iter_var in iterable if cond_expr)
大數據
列表推導和生成器表達式提供了一種很是簡潔高效的方式來建立列表或者迭代器
# pythonic 寫法 squares = [x * x for x in range(10)] # 通常寫法 squares = [] for x in range(10): squares.append(x * x)
python 裏面 map 的遍歷有不少種方式,在須要同事使用 key 和 value 的場合,建議使用 items()
函數
m = {'one': 1, 'two': 2, 'three': 3} for k, v in m.items(): print(k, v) for k, v in sorted(m.items()): print(k, v)
轉載請註明出處
本文連接: http://hatlonely.github.io/20...