標籤:python 意思 列印 即時 迭代 div ext logs 產生
這裡涉及幾個知識點:迭代器、產生器、yieId
先用個例子看一下迭代器與產生器的區別吧
#L是個list,迭代用for迴圈即可,L取出來是存放在記憶體中的,再多次去迴圈取出都可以
>>> L=[x*x for x in range(3)]>>> for i in L:print(i)014>>> for n in L:print(n)014
#把[]換成了()就成了產生器,只不過它只能迴圈出一次,因為它不是放在記憶體中的。它是即時產生資料的。>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:print (i)014
#看我再迴圈一次,它已是空值>>> for n in mygenerator:print(n)>>>
其實我感覺上最大差的幾點有以下:
1、list函數調用直接出結果。而產生器是一個對象
>>> L = [1,2,3,4,5,6]>>> def xh():for i in L:print(i)>>> g=xh()123456
>>> L1=[6,7,8,9,10]>>> def generator():yield(L1)for i in L1:print(i)>>> g=generator()>>> next(g)[6, 7, 8, 9, 10]
這裡有個yield的對比,大家感受一下
>>> L1=[6,7,8,9,10]>>> def generator():yield(L1) #列印L1的意思 for i in L1:print(i)>>> g=generator() #這裡是一個產生器對象>>> next(g) #用next列印出來[6, 7, 8, 9, 10]#產生器第2個例子>>> def gen2():for i in L1:yield(i) #列印i的值print(i)>>> g=gen2()>>> print(g)<generator object gen2 at 0x0000000002EAFD00>>>> for x in g:print(x)667788991010
2、其實想想也挺簡單,yield只不過就是個標識,同時列印一次該結果
經典案例:楊輝三角
#將楊輝三角的每一行看成一個list,寫一個產生器(generator),不斷輸出下一行listdef triangel(n): L=[1] #定義一個list[1] while True: yield L #列印出該list L=[L[x]+L[x+1] for x in range(len(L)-1)] #計算下一行中間的值(除去兩邊的1) L.insert(0,1) #在開頭插入1 L.append(1) #在結尾添加1 if len(L)>10: #僅輸出10行 break#產生一個generator對象,然後通過for迴圈迭代輸出每一行a=angel(10)for i in a: print(i)
#結果[1][1, 1][1, 2, 1][1, 3, 3, 1][1, 4, 6, 4, 1][1, 5, 10, 10, 5, 1][1, 6, 15, 20, 15, 6, 1][1, 7, 21, 35, 35, 21, 7, 1][1, 8, 28, 56, 70, 56, 28, 8, 1][1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
python-迭代器與產生器的區別