python——生成器详解
一、生成器的由來
列表和列表生成器都無法解決內存受限的問題,列表中的所有數據都保存在內存中,以至于列表中的元素的太多了,當列表中的元素超過超過幾十萬甚至幾百萬,大量數據占用電腦內存,從而導致內存溢出,不利于我們后面的編程,所以要引用生成器
二、生成器定義
生成器是python中的一個對象(按照某種規律,來生成元素的對象),生成器不是列表,保存了產生元素的算法,同時會記錄游標的位置(現在拿到第幾個元素了),為了下次繼續拿數據,而不是從頭開始拿數據。可以通過一直調用next()方法獲取值,這個對象不保存數據,每次調用會返回一個值,即做到了列表的好處,又不占用空間。
三、創建生成器
第一種方法:通過列表生成式來創建
generator:表示生成器
第二種方法:通過函數創建生成器(yield)
1、例如創建有限的斐波拉且數列
yield一般用于創建生成器,作用:返回后面變量(b)給生成器,而不是返回給函數的,b就是斐波拉且數列中的一個元素
只要在函數中有yield關鍵字,那么當前這個函數是屬于生成器中保存的算法,算法實現的功能就是生成b
不會打印done
2、例如創建無限的斐波拉且數列,不能用for循環
注意:yield:是沒有返回值的,如果賦值的話會打印None
輸出結果為:
四、遍歷生成器中的元素
第一種方法:
通過next(g),每調用一次next(),就會拿掉一個值(表達式中的第一個值),當已經遍歷到生成器的結尾,會拋一個異常StopIteration。第4次調用next()的時候,生成器中已經沒有數據了,繼續調用會報錯
第二種方法:
通過for循環遍歷,for循環不會拋出異常
for循環的打印結果為:4,5,6,7,因為調用了一次next(g),游標已經往下走了,
第三種方法
object內置的__next__,當已經遍歷到生成器的結尾,會拋一個異常StopIteration
第四種方法
send函數:但是生成器的第一個值必須使用send(None),后面的值就沒有限制了
總結
以上是生活随笔為你收集整理的python——生成器详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python—类和对象之浅拷贝和深拷贝详
- 下一篇: python——迭代器