標籤:python
比如a =[1,2,3]
如果想生成乙個b裡面存的是a的2倍,則可以使用[2*i for i in a]
。
上面通過生成式雖然可以生成乙個列表,但是如果我們列表過於大,可能一次儲存不下,所以便有了生成器這個說法。
生成器你可以把他看做乙個方法,每次使用一下它,他就能幫你按照你的規則生成乙個數。在python中可以使用兩種方法建立乙個生成器。
第一種就是把上面的生成式中的換成
()
,比如g =(i for i in range(0,9))
,其實就是建立了乙個生成器g,你可以使用next(g)
訪問生成器的乙個乙個的值,也可以使用for i in g:
來遍歷整個生成器,只是使用next的時候在訪問到最後乙個元素會丟擲乙個異常,而for不會。
第二種是通過yield
關鍵字,我們可以定義乙個函式:
def
gen():
print
("***"
)for i in
range(10
):yield i
print
("----"
)g = gen(
)print
(next
(g))
print
("%%%"
)for i in g:
print
(i)
你會發現輸出的可能跟你想象的不一樣,在這裡由於函式中有yield
關鍵字,所以把這個函式看做是乙個生成器,你可以使用type來看g的型別,然後呼叫的時候g = gen()
你發現並沒有輸出***
,這是由於g=gen()只是建立了乙個生成器,但是並沒有使用,而下面使用next(g)
就相當於使用了生成器開始,生成器會走到yiled那個地方,然後停止,等待下次使用next,所以print(next(g))
後會輸出兩句話第乙個是***和0,然後我們使用for遍歷生成器,其實還是相當於呼叫了next,只是幫你執行了,所以繼續訪問,則會輸出1-9,然後生成器在生成結束後,就相當於函式結束,所以會輸—。生成器的概念可能不太好理解,但是多做點題估計就行了。
def
gen():
i =0while
true
:yield i
i=i+
1g = gen(
)for i in g:
print
(i)
這個**就相當於做了乙個不斷生成遞增數的生成器。
可迭代的概念比較好理解,向我們之前學的列表,元組,以及生成式,生成器,這些都可以通過for遍歷,所以都是可迭代的,所以都是iterable
你可以通過下面**檢查是否可迭代:
from collections import iterable
a = [1,2,3]
isinstance(a, iterable)
而迭代器代表能夠使用next訪問下個元素的,比如上面學習的生成器就是乙個迭代器,你可以通過下面**檢查是否為乙個迭代器。
from collections import iterator
a = (x for x in range(10))
isinstance(a, iterator)
一定注意乙個是iterable
乙個是iterator
。一般迭代器一定可迭代,但可迭代不一定是迭代器。 python中生成器
生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...
python 生成式和生成器
python的生成式 推導式 和等價的for迴圈完成的是相同的工作,不同的是生成式執行速度快,更加整潔。python的四個基礎資料結構 列表 集合 元組 字典 除了元組因為其資料特點沒有生成式,其餘三個都有,集合的生成式不太常見。生成式這個名字就知道是生成列表的 我們也可以用for來生成列表 用fo...
python中生成器yield
def yield demo for x in range 3 yield x print 生成器後一行 a yield demo print a 這裡的a是乙個生成器物件 可以用for迴圈來遍歷生成器物件裡的元素 for i in a print i 那麼yield的工作過程是怎麼樣的呢?可以通過...