摘要:生成器可以簡(jiǎn)單理解成一個(gè)函數(shù),每次執(zhí)行到語(yǔ)句就返回一個(gè)值,通過(guò)不停地調(diào)用這個(gè)函數(shù),就能獲取到所有的值,這些值就能構(gòu)成了一個(gè)等效的列表,但是與列表不同的是,這些值是不斷計(jì)算得出,而列表是在一開(kāi)始就計(jì)算好了,這就是的思想。
python 是一門(mén)簡(jiǎn)單而優(yōu)雅的語(yǔ)言,可能是過(guò)于簡(jiǎn)單了,不用花太多時(shí)間學(xué)習(xí)就能使用,其實(shí) python 里面還有一些很好的特性,能大大簡(jiǎn)化你代碼的邏輯,提高代碼的可讀性
關(guān)于 pythonic,你可以在終端打開(kāi) python,然后輸入 import this,看看輸出什么,這就是 Tim Peters 的 《The Zen of Python》,這首充滿(mǎn)詩(shī)意的詩(shī)篇里概況了 python 的設(shè)計(jì)哲學(xué),而這些思想,其實(shí)在所有語(yǔ)言也基本上是通用的
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 里面一個(gè)非常有用的語(yǔ)法特性,卻也是最容易被忽視的一個(gè),可能是因?yàn)榇蟛糠帜苡蒙善鞯牡胤揭材苡昧斜戆伞?/p>
生成器可以簡(jiǎn)單理解成一個(gè)函數(shù),每次執(zhí)行到 yield 語(yǔ)句就返回一個(gè)值,通過(guò)不停地調(diào)用這個(gè)函數(shù),就能獲取到所有的值,這些值就能構(gòu)成了一個(gè)等效的列表,但是與列表不同的是,這些值是不斷計(jì)算得出,而列表是在一開(kāi)始就計(jì)算好了,這就是 lazy evaluation 的思想。這個(gè)特性在數(shù)據(jù)量特別大的場(chǎng)景非常有用,比如大數(shù)據(jù)處理,一次無(wú)法加載所有的文件,使用生成器就能做到一行一行處理,而不用擔(dān)心內(nèi)存溢出
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 子句簡(jiǎn)化循環(huán)和異常
if / else 大家都用過(guò),但是在 python 里面,else 還可以用在循環(huán)和異常里面
# pythonic 寫(xiě)法 for cc in ["UK", "ID", "JP", "US"]: if cc == "CN": break else: print("no CN") # 一般寫(xiě)法 no_cn = True for cc in ["UK", "ID", "JP", "US"]: if cc == "CN": no_cn = False break if no_cn: print("no CN")
else 放在循環(huán)里面的含義是,如果循環(huán)全部遍歷完成,沒(méi)有執(zhí)行 break,則執(zhí)行 else 子句
# pythonic 寫(xiě)法 try: db.execute("UPDATE table SET xx=xx WHERE yy=yy") except DBError: db.rollback() else: db.commit() # 一般寫(xiě)法 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 放到異常里面可以表示,如果沒(méi)有異常發(fā)生需要執(zhí)行的操作
用 with 子句自動(dòng)管理資源我們都知道,打開(kāi)的文件需要在用完之后關(guān)閉,要不就會(huì)造成資源泄露,但是實(shí)際編程的時(shí)候經(jīng)常會(huì)忘記關(guān)閉,特別是在一些邏輯復(fù)雜的場(chǎng)景中,更是如此,python 有一個(gè)優(yōu)雅地解決方案,那就是 with 子句
# pythonic 寫(xiě)法 with open("pythonic.py") as fp: for line in fp: print(line[:-1]) # 一般寫(xiě)法 fp = open("pythonic.py") for line in fp: print(line[:-1]) fp.close()
使用 with as 語(yǔ)句后,無(wú)需手動(dòng)調(diào)用 fp.close(), 在作用域結(jié)束后,文件會(huì)被自動(dòng) close 掉,完整的執(zhí)行過(guò)如下:
調(diào)用 open("pythonic.py"),返回的一個(gè)對(duì)象 obj,
調(diào)用 obj.__enter__() 方法,返回的值賦給 fp
執(zhí)行 with 中的代碼塊
執(zhí)行 obj.__exit__()
如果這個(gè)過(guò)程發(fā)生異常,將異常傳給 obj.__exit__(),如果 obj.__exit__() 返回 False, 異常將被繼續(xù)拋出,如果返回 True,異常被掛起,程序繼續(xù)運(yùn)行
列表推導(dǎo)與生成器表達(dá)式列表推導(dǎo)
[expr for iter_var in iterable if cond_expr]生成器表達(dá)式
(expr for iter_var in iterable if cond_expr)
列表推導(dǎo)和生成器表達(dá)式提供了一種非常簡(jiǎn)潔高效的方式來(lái)創(chuàng)建列表或者迭代器
# pythonic 寫(xiě)法 squares = [x * x for x in range(10)] # 一般寫(xiě)法 squares = [] for x in range(10): squares.append(x * x)用 items 遍歷 map
python 里面 map 的遍歷有很多種方式,在需要同事使用 key 和 value 的場(chǎng)合,建議使用 items() 函數(shù)
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 語(yǔ)言規(guī)范: http://zh-google-styleguide.r...
《編寫(xiě)高質(zhì)量代碼:改善 Python 程序的91個(gè)建議》
轉(zhuǎn)載請(qǐng)注明出處
本文鏈接:http://hatlonely.github.io/20...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41374.html
摘要:讓你收獲滿(mǎn)滿(mǎn)碼個(gè)蛋從年月日推送第篇文章一年過(guò)去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類(lèi)別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿(mǎn)滿(mǎn)! 碼個(gè)蛋從2017年02月20...
摘要:常規(guī)的使用來(lái)統(tǒng)計(jì)一段代碼運(yùn)行時(shí)間的例子輸出結(jié)果總結(jié)其實(shí)是一門(mén)特別人性化的語(yǔ)言,但凡在工程中經(jīng)常遇到的問(wèn)題,處理起來(lái)比較棘手的模式基本都有對(duì)應(yīng)的比較優(yōu)雅的解決方案。 python的高級(jí)特性 名詞與翻譯對(duì)照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...
摘要:另一個(gè)賦值語(yǔ)句將名稱(chēng)關(guān)聯(lián)到出現(xiàn)在莎士比亞劇本中的所有去重詞匯的集合,總計(jì)個(gè)。表達(dá)式是一個(gè)復(fù)合表達(dá)式,計(jì)算出正序或倒序出現(xiàn)的莎士比亞詞匯集合。在意圖上并沒(méi)有按照莎士比亞或者回文來(lái)設(shè)計(jì),但是它極大的靈活性讓我們用極少的代碼處理大量文本。 1.1 引言 來(lái)源:1.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 計(jì)算機(jī)科學(xué)是一個(gè)極其寬泛的學(xué)科。全球的分布...
摘要:布爾值布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有兩種值的數(shù)據(jù)類(lèi)型可以通過(guò)內(nèi)置的函數(shù)查詢(xún),例如還可以用來(lái)判斷和的區(qū)別在于不會(huì)認(rèn)為子類(lèi)是一種父類(lèi)類(lèi)型。會(huì)認(rèn)為子類(lèi)是一種父類(lèi)類(lèi)型?;竟δ苁沁M(jìn)行成員關(guān)系測(cè)試和刪除重復(fù)元素。 ...
摘要:鏈接中文翻譯常用庫(kù)推薦除了上面提到的之外,也是一個(gè)很好的選項(xiàng)。官網(wǎng)中文翻譯如果你要編寫(xiě)簡(jiǎn)單的爬蟲(chóng),來(lái)爬去互聯(lián)網(wǎng)上的信息,或者調(diào)用一些外部的機(jī)遇的接口,使用這個(gè)庫(kù)再也合適不過(guò)了。 作者:安龍 LeanCloud 工程師 引言 :前段時(shí)間有同學(xué)反映 Python 的學(xué)習(xí)資源匯總很少。那么學(xué)習(xí)資料哪個(gè)質(zhì)量更好,效率更高?Python 有哪些非常值得學(xué)習(xí)的庫(kù)?2017 年了學(xué) 2 還是學(xué) 3 ...
閱讀 1777·2021-10-11 10:57
閱讀 2371·2021-10-08 10:14
閱讀 3407·2019-08-29 17:26
閱讀 3369·2019-08-28 17:54
閱讀 3037·2019-08-26 13:38
閱讀 2915·2019-08-26 12:19
閱讀 3622·2019-08-23 18:05
閱讀 1290·2019-08-23 17:04