生成器和迭代器

2022-07-27 02:09:13 字數 2167 閱讀 9495

迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

可迭代物件:

以直接作用於 for 迴圈的資料型別有以下幾種:

一類是集合資料型別,如 list 、 tuple 、 dict 、 set 、 str 等;

一類是 generator (下面),包括生成器和帶 yield 的generator function。

這些可以直接作用於 for 迴圈的物件統稱為可迭代物件: iterable 。

凡是可作用於 for 迴圈的物件都是 iterable 型別;

凡是可作用於 next() 函式的物件都是 iterator 型別

集合資料型別如 list 、 dict 、 str 等是 iterable 但不是 iterator ,不過可以通過 iter() 函式獲得乙個 iterator 物件

1.列表生成式

list = [i*2 for i in range(5)]

list

out:[0,2,4,6,8]

生成的list為[0,2,4,6,8]

2.元組生成式

tuple = (i*2 for i in range(5))

tuple

out:at 0x000002308a3adfc0>

結果並沒有生成乙個元組,而是乙個生成器。

利用列表生成式,我們可以直接建立乙個列表。但是,列表中的所有元素都被存放在了記憶體中,占用了大量記憶體空間。為了節省記憶體,在python中,如果列表元素可以按照某種演算法推算出來,那我們就不必建立完整的list。這種一邊迴圈一邊計算的機制,稱為生成器(generator)。比如:元組生成式。

tuple = (i*2 for i in range(5))

next(tuple)

out:0

next(tuple)

out:2

生成器可以通過next()方法計算下乙個元素的值。

for i in

tuple:

print

(i)out:0 2 4 6 8

也可以通過for迴圈取值,因為生成器是可迭代的。

生成器函式

含有yield關鍵字的成為生成器函式,yield作用和return類似,把yield後面的內容返回,但乙個函式可以有多個yield。

def

generator():

print('1'

)

yield'a

'print('2'

)

yield'b

'yield'c

'g = genarator() #

得到乙個生成器g

ret = g.__next__

()print

(ret)

ret = g.__next__

()print

(ret)

ret = g.__next__

()print(ret)

每執行一次g.__next__(),函式會停止在yield,並把內容返回。

也可以用for迴圈一次性執行

for i in

g:

print(i)

效果與上面相同。

send方法

#

生成器的send用法 generator.send(value)

deftest():

i = 1

while i < 5:

temp = yield i**2

print

(temp)

i += 1t =test()

#第一次執行只能使用next或者send(none)

print(t.__next__

())#

send的作用相當於使生成器繼續執行,並且傳遞的引數為yield的返回值(程式中即temp的值)

print(t.send("

hello world"))

print(t.__next__())#

相當於send(none) 此時temp = none

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...