列表生產式和生成器
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關鍵字的時候,你可以理解成函數的
說明: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) #報錯
列表生產式和生成器