1. 程式人生 > >列表生產式和生成器

列表生產式和生成器

python

1.列表生成式:通過簡潔的語法可以對一組元素進行過濾


格式:[exp for val in collection if condition]


例子1:

a = [x*x for x in xrange(1,10) if x%2 == 0]

print(a)


1)append():

該方法用於在列表末尾添加新的對象,語法格式:

list.append(obj)


def funcA():

list1 = []

for x in xrange(1,10):

if x%2 == 0:

list1.append(x*x)

return list1

print funcA()

結果:

[4, 16, 36, 64]

[4, 16, 36, 64]



2.生成器:一邊循環,一邊計算


方式一

把生產式中的[ ]修改成()


例子:

a = (x*x for x in xrange(1,10) if x%2 == 0)

print(a.next())

print(a.next())

for i in a:

print(i)

結果:

4

16

36

64


方式二

如果一個函數定義中包含yield關鍵字,那麽這個函數就不再是一個普通函數,而是一個generator。包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持叠代器接口。每當遇到yield關鍵字的時候,你可以理解成函數的

return語句,yield後面的值,就是返回的值。但是不像一般的函數在return後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效,下次從yield下面的部分開始執行。


說明:yield 是一個類似 return 的關鍵字,帶有yield的函數不僅僅只用於for循環中,而且可用於某個函數的參數


例子2:

def sum(x):

i=0

sum=0

while i<x:

sum+=i

i+=1

yield (sum)

for y in sum(5):

print(y)

print(type(sum(5)))


結果:

0

1

3

6

10

<type‘generator‘>


3.生成式和生成器的區別

前者直接返回了表達式的結果列表, 而後者是一個對象,該對象包含了對表達式結果的計算引用, 通過循環可以直接輸出。

當表達式的結果數量較少的時候, 使用列表生成式還好, 一旦數量級過大, 那麽列表生成式就會占用很大的內存。

而生成器並不是立即把結果寫入內存, 而是保存的一種計算方式, 通過不斷的獲取, 可以獲取到相應的位置的值,所以占用的內存僅僅是對計算對象的保存。


例子:

1)列表生成式,這裏是中括號

[x*x for x in range(0,10)]


結果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


2)生成器, 這裏是小括號

(x*x for x in range(0,10))


結果:

<generator object <genexpr> at 0x7f0b072e6140>


生成器使用時,需如下執行:

g = (x*x for x in range(0,10))

for n in g:

print n


結果:

0

1

4

9

16

25

36

49

64

81


4.print、return和yield的區別

def func1():

for i in range(1, 5):

print i

def func2():

for i in range(1, 5):

return i

def func3():

for i in range(1, 5):

yield i

func1()

print func2()

print func3()


說明:

1.print並不會阻斷程序的執行

2.func2()方法中的循環執行第一次就被return結束掉(後面的2、3、4就不會有返回的機會了)

3.yield你可以通俗的叫它"輪轉容器",可用現實的一種實物來理解:水車,先yield來裝入數據、產出generator object、使用next()來釋放;好比水車轉動後,車輪上的水槽裝入水,隨著輪子轉動,被轉到下面的水槽就能將水送入水道中流入田裏


例子:

def func3():

for i in range(1,5):

yield i #裝入


gob = func3() #generator 類型

print next(gob) #1 釋放的第一個裝入的數據,(先入先出)

print next(gob) #2

print next(gob) #3

print next(gob) #4

print next(gob) #報錯



列表生產式和生成器