1. 程式人生 > >python-叠代器與生成器的區別

python-叠代器與生成器的區別

經典 ria yield pri end int log cnblogs 叠代器

這裏涉及幾個知識點:叠代器、生成器、yieId

先用個例子看一下叠代器與生成器的區別吧

#L是個list,叠代用for循環即可,L取出來是存放在內存中的,再多次去循環取出都可以
>>> L=[x*x for x in range(3)] >>> for i in L: print(i) 0 1 4 >>> for n in L: print(n) 0 1 4

#把[]換成了()就成了生成器,只不過它只能循環出一次,因為它不是放在內存中的。它是實時生成數據的。 >>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: print (i) 0 1 4
#看我再循環一次,它已是空值 >>> 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()
1
2
3
4
5
6

>>> 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)

	
6
6
7
7
8
8
9
9
10
10

2、其實想想也挺簡單,yield只不過就是個標識,同時打印一次該結果

經典案例:楊輝三角

#將楊輝三角的每一行看成一個list,寫一個生成器(generator),不斷輸出下一行list
def 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-叠代器與生成器的區別