迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。
迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
可迭代物件:
以直接作用於 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 intuple:
(i)out:0 2 4 6 8
也可以通過for迴圈取值,因為生成器是可迭代的。
生成器函式
含有yield關鍵字的成為生成器函式,yield作用和return類似,把yield後面的內容返回,但乙個函式可以有多個yield。
defgenerator():
print('1'
)
yield'a
'print('2'
)
yield'b
'yield'c
'g = genarator() #
得到乙個生成器g
ret = g.__next__
(ret)
ret = g.__next__
(ret)
ret = g.__next__
()print(ret)
每執行一次g.__next__(),函式會停止在yield,並把內容返回。
也可以用for迴圈一次性執行
for i ing:
print(i)
效果與上面相同。
send方法
#生成器的send用法 generator.send(value)
deftest():
i = 1
while i < 5:
temp = yield i**2
(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...