列表生成器
求斐波拉契數列
yield關鍵字
指能夠快速生成列表的**推導式。
例如:(1)求0到100的數字列表:
[i for i in range(101)]
(2)求0到100的偶數列表:
[i for i in range(101) if i % 2 == 0]
(3)求0到100的奇數列表:
[i for i in range(101) if i % 2 != 0]
(4)9×9乘法表的數值列表:
[i*j i for i in range(1,10) for j in range(1,10)]
優點:功能強大,可以快速生成列表。
缺點:直接生成列表,當列表的元素很多的時候對記憶體的占用會非常誇張。
指將推導式的計算結果不一次性返回,而是通過全域性函式中的next( )函式來返回數值。
將列表推導式的方括號轉換為圓括號就成為了列表生成器。
將列表推導式–>列表生成器
[ ] ==> ( )
例如:9×9乘法表的數值列表:
a = [i*j for i in range(1,10) for j in range(1,10)]
a#返回列表生成器物件及位址
next(a)
#返回生成的列表中的第乙個數
next(a)
#返回生成的列表中的第二個數
也可以使用迭代:
for x in a :
print(x)
選取其中的值:
for x in a :
if x == 20:
print(x)
ps:(1)next( )返回的值不能後退只能前進,返回到最後乙個值的時候該列表為空。
(2)當next( )返回到最後乙個值之後再次使用則會報錯。
(3)魔法屬性方法中的__next__( ) 等價於全域性函式中的next( )
求取複雜列表的通式,單純的使用列表生成器是很困難的,可能需要寫成函式才能得到。
ls =
def fibonacci(num):
first,second = 1,2
count = 0
while count < num:
first, second = second, first + second
count += 1
fibonacci( )
print(ls)
上述的函式在呼叫後會直接將所有的值返回,當列表的元素很多的時候對記憶體的占用會非常誇張。這時就需要使用yield關鍵字將函式轉換為列表生成器。
yield關鍵字在函式**現,和return類似,用來返回結果。但是yield返回的結果是乙個生成器,當我們使用next函式呼叫這個生成器的結果時,在第一次進入函式後**會從yield返回,再次呼叫時會回到yield之後繼續執行並返回至第一次進入的位置再次迴圈。
因此上述的求斐波拉契數列的函式可以寫成:
def fibonacci(num):
first,second = 1,2
count = 0
while count < num:
first, second = second, first + second
yield second
count += 1
res = fibonacci( )
#迴圈出生成器res中的值
for x in res:
print(x)
php的Generator生成器及yield
官方文件 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。生成器允許你在foreach 塊中寫 來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫乙個生成器函式,就像...
015 python函式式程式設計 生成器 yield
在乙個函式中經常使用return關鍵字返回資料,但是有時候會使用yield關鍵字返回資料。使用yield關鍵字的函式返回的是乙個生成器 generator 物件,生成器物件是一種可迭代物件。def square num 定義引數函式 n list for i in range 1,num 1 ret...
生成器高階
def generator print 123 count yield 1 print count print 456 yield 2g generator ret g.next print ret ret g.send 套你大象 send的效果與next一樣 send在獲取下乙個值時,會在上乙個y...