1. 程式人生 > ><python全棧開發基礎>學習過程筆記【17d】生成器

<python全棧開發基礎>學習過程筆記【17d】生成器

我們 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】生成器