<python全棧開發基礎>學習過程筆記【17d】生成器
阿新 • • 發佈:2017-08-12
我們 ack cnblogs 生成式 而不是 簡寫 為什麽 ati lin
1.列表生成式
>>> [i**2 for i in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
這個過程是從range(10)列表中依次取元素,計算元素的平方,再放到另一個列表中
2.可以把【1】中的代碼寫成這種形式
>>> def f(x): return x**2 >>> [f(i) for i in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3.元組(列表)內元素個數為n,用元組(列表)給n個變量賦值
>>> a=(1,2,3)>>> x,y,z=a >>> x 1 >>> y 2 >>> z 3
>>> b=[1,2,3] >>> x1,y1,z1=b >>> x1 1 >>> y1 2 >>> z1 3
4.生成器有兩種創建方式
方法一:
>>> ( i**2 for i in range(10)) <generator object <genexpr> at 0x03B21480>
generator就是生成器
這裏我們生成了一個生成器對象,為什麽我們要生成這樣一個對象,而不是列表?因為列表是把值存在列表中...當數據很多時,非常消耗內存。
生成器對象中什麽都沒存...但它什麽都能搞到。用生成器省了空間。
生成器中的值只能一個一個的取
>>> g=( i**2 for i in range(10)) >>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g)25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) #越界 Traceback (most recent call last): File "<pyshell#34>", line 1, in <module> next(g) StopIteration
生成器是一個可叠代對象,所以上面的代碼可以簡寫為:
>>> s=(i**2 for i in range(10)) >>> for i in s: #內部:for in循環自動調用next,得到一個值,用i取這個值,使用之後,這個值被垃圾回收機制刪除...所以很節省空間 print(i) 0 1 4 9 16 25 36 49 64 81
方法二:
使用關鍵字yield
生成器的本質是一個帶yield關鍵字的函數
>>> def a(): print("ok1") yield 1 #yield返回一個值 print("ok2") yield 2 >>> next(a()) #a()就是一個生成器,每一次next()都會運行到返回一個值為止 ok1 1 >>> next(a()) ok1 1
當然還有下面的寫法:
>>> for i in a(): #i每次存一個yield返回的值 print(i) ok1 1 ok2 2
5..什麽是可叠代對象?可叠代對象可以使用for in
內部有iter方法的對象就是可叠代對象
可叠代對象有:列表,元組,字符串,字典,生成器對象
<python全棧開發基礎>學習過程筆記【17d】生成器