python中生成式和生成器 迭代器與可迭代

2021-09-11 16:59:17 字數 1860 閱讀 2605

標籤: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的工作過程是怎麼樣的呢?可以通過...