摘要:生成器可以簡單理解成一個函數,每次執行到語句就返回一個值,通過不停地調用這個函數,就能獲取到所有的值,這些值就能構成了一個等效的列表,但是與列表不同的是,這些值是不斷計算得出,而列表是在一開始就計算好了,這就是的思想。
python 是一門簡單而優雅的語言,可能是過于簡單了,不用花太多時間學習就能使用,其實 python 里面還有一些很好的特性,能大大簡化你代碼的邏輯,提高代碼的可讀性
關于 pythonic,你可以在終端打開 python,然后輸入 import this,看看輸出什么,這就是 Tim Peters 的 《The Zen of Python》,這首充滿詩意的詩篇里概況了 python 的設計哲學,而這些思想,其實在所有語言也基本上是通用的
Beautiful is better than ugly.使用生成器 yield
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 里面一個非常有用的語法特性,卻也是最容易被忽視的一個,可能是因為大部分能用生成器的地方也能用列表吧。
生成器可以簡單理解成一個函數,每次執行到 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)用 else 子句簡化循環和異常
if / else 大家都用過,但是在 python 里面,else 還可以用在循環和異常里面
# 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 子句
# 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 放到異常里面可以表示,如果沒有異常發生需要執行的操作
用 with 子句自動管理資源我們都知道,打開的文件需要在用完之后關閉,要不就會造成資源泄露,但是實際編程的時候經常會忘記關閉,特別是在一些邏輯復雜的場景中,更是如此,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)用 items 遍歷 map
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)參考鏈接
Google python 語言規范: http://zh-google-styleguide.r...
《編寫高質量代碼:改善 Python 程序的91個建議》
轉載請注明出處
本文鏈接:http://hatlonely.github.io/20...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41374.html
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:常規的使用來統計一段代碼運行時間的例子輸出結果總結其實是一門特別人性化的語言,但凡在工程中經常遇到的問題,處理起來比較棘手的模式基本都有對應的比較優雅的解決方案。 python的高級特性 名詞與翻譯對照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...
摘要:另一個賦值語句將名稱關聯到出現在莎士比亞劇本中的所有去重詞匯的集合,總計個。表達式是一個復合表達式,計算出正序或倒序出現的莎士比亞詞匯集合。在意圖上并沒有按照莎士比亞或者回文來設計,但是它極大的靈活性讓我們用極少的代碼處理大量文本。 1.1 引言 來源:1.1 Introduction 譯者:飛龍 協議:CC BY-NC-SA 4.0 計算機科學是一個極其寬泛的學科。全球的分布...
摘要:布爾值布爾值和布爾代數的表示完全一致,一個布爾值只有兩種值的數據類型可以通過內置的函數查詢,例如還可以用來判斷和的區別在于不會認為子類是一種父類類型。會認為子類是一種父類類型。基本功能是進行成員關系測試和刪除重復元素。 ...
摘要:鏈接中文翻譯常用庫推薦除了上面提到的之外,也是一個很好的選項。官網中文翻譯如果你要編寫簡單的爬蟲,來爬去互聯網上的信息,或者調用一些外部的機遇的接口,使用這個庫再也合適不過了。 作者:安龍 LeanCloud 工程師 引言 :前段時間有同學反映 Python 的學習資源匯總很少。那么學習資料哪個質量更好,效率更高?Python 有哪些非常值得學習的庫?2017 年了學 2 還是學 3 ...
閱讀 1768·2021-10-11 10:57
閱讀 2352·2021-10-08 10:14
閱讀 3393·2019-08-29 17:26
閱讀 3340·2019-08-28 17:54
閱讀 3021·2019-08-26 13:38
閱讀 2885·2019-08-26 12:19
閱讀 3608·2019-08-23 18:05
閱讀 1277·2019-08-23 17:04