創新互聯www.cdcxhl.cn八線動態BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網站建設、做網站、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的河源網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!python中的生成器是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
生成器,是一個用來創建迭代器的工具。它簡單而強大,類似寫函數那樣進行定義,但是需要返回數據時不是使用return,而是使用yield語句。
生成器函數
用yield語句返回數據的“函數”,稱為生成器函數。我們把上一節中自定義類LessThan改寫成生成器函數
In [30]: def lessthan(n): ...: for i in range(n-1, -1, -1): ...: yield i ...: ...: In [31]: for i in lessthan(5): ...: print(i) ...: 4 3 2 1 0 In [32]: lt = lessthan(3) ## 查看生成器對象的__iter__()和__next__(): In [33]: lt.__iter__? Signature: lt.__iter__() Call signature: lt.__iter__(*args, **kwargs) Type: method-wrapper String form: <method-wrapper '__iter__' of generator object at 0x7fc048cb8ba0> Docstring: Implement iter(self). In [34]: lt.__next__? Signature: lt.__next__() Call signature: lt.__next__(*args, **kwargs) Type: method-wrapper String form: <method-wrapper '__next__' of generator object at 0x7fc048cb8ba0> Docstring: Implement next(self).
通過生成器改寫LessThan類后,代碼更加簡潔緊湊,因為它自動創建了__iter__()和__next__()方法,通過for循環可以遍歷生成器對象。
接下來我們定義一個生成器對象lt,對這個生成器對象調用next(),每一次調用它都會從上次離開的位置回復執行(也就是記住上次執行語句時的所有數據值)。當生成器生成了所有元素(生成器終結)就會引發StopIteration錯誤。
In [53]: lt = lessthan(3) In [54]: next(lt) Out[54]: 2 In [55]: next(lt) Out[55]: 1 In [56]: next(lt) Out[56]: 0 In [57]: next(lt) --------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-37-00f31299a3f9> in <module> ----> 1 next(lt) StopIteration:
生成器解析式
為了實現一些簡單的生成器,我們可以不用函數的形式,而是用類似列表解析式的語法,將外層的方括號用圓括號代替即可。
生成器表達式相比完整的生成器更緊湊但較不靈活,相比等效的列表推導式則更為節省內存。比如下面的的代碼,用列表表達式生成的mylist的每個元素都保存在內存中,而mygener每次迭代時才會產生一個元素。假設元素個數不是10,而是100萬甚至更多,此時生成器的內存優勢會非常明顯。
In [41]: mylist = [i*i for i in range(10)] In [42]: mylist Out[42]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] In [43]: mygener = (i*i for i in range(10)) In [44]: mygener Out[44]: <generator object <genexpr> at 0x7fc048be3bf8>
生成器解析式被設計用于生成器將立即被外層函數所使用的情況,比如:
In [45]: sum(i*i for i in range(10)) Out[45]: 285
sum()括號里面的i*i for i in range(10)就是一個生成器解析式,避免生成一個列表而占用過多內存。
同樣的,下面的例子中都是使用了生成器解析式:
xvec = [10, 20, 30] yvec = [7, 5, 3] sum(x*y for x,y in zip(xvec, yvec)) # dot product from math import pi, sin sine_table = {x: sin(x*pi/180) for x in range(0, 91)} unique_words = set(word for line in page for word in line.split()) valedictorian = max((student.gpa, student.name) for student in graduates) data = 'golf' list(data[i] for i in range(len(data)-1, -1, -1))
總結
Python提供了兩種方式實現生成器:
(1)生成器函數
語法上與普通函數相似,用yield替代return換回值;自動實現迭代器協議:__iter__()方法和__next__()方法。沒有值可返回時,引起StopInteration異常。yield語句掛起生成器函數的狀態,以便再次迭代時從離開的狀態繼續執行。
(2)生成器解析式
類似列表解析式,用圓括號替換方括號,從而簡單實現簡單的生成器。
(3)生成器的優點
代碼緊湊,節省內存。不像列表可以多次遍歷,生成器只能遍歷一遍。
看完上述內容,你們掌握python中的生成器是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯-成都網站建設公司行業資訊頻道,感謝各位的閱讀!
網頁名稱:python中的生成器是什么-創新互聯
文章位置:http://vcdvsql.cn/article34/ddhgse.html
成都網站建設公司_創新互聯,為您提供做網站、App設計、Google、動態網站、定制開發、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯