參考自:
參考自:
可迭代物件(iterable):可直接作用於for迴圈的物件的統稱,如list、tuple、dict、set、str、生成器等。
可以用isinstance()判斷乙個物件是否為iterable:
>>> from collections import iterable
>>> isinstance(, iterable)
true
>>> isinstance({}, iterable)
true
>>> isinstance('abc', iterable)
true
>>> isinstance((x for x in range(10)), iterable)
true
>>> isinstance(100, iterable)
false
迭代器(iterator):可以作用於next()函式的物件的統稱。
python中iterator物件表示乙個資料流,不能提前知道資料流的長度,只能通過next()呼叫。所以說iterator的計算是惰性的,只有在需要返回的時候才會返回下乙個資料。
可以用isinstance()判斷乙個物件是否為iterator:
>>> from collections import iterator
>>> isinstance((x for x in range(10)), iterator)
true
>>> isinstance(, iterator)
false
>>> isinstance({}, iterator)
false
>>> isinstance('abc', iterator)
false
用iter()函式可以把list
、dict
、str
等iterable
變成iterator:
>>> isinstance(iter(), iterator)
true
>>> isinstance(iter('abc'), iterator)
true
>>> a = iter([1,2,3])
>>> print a.next()
1>>> print a.next()
2>>> print a.next()
3>>> print a.next()
traceback (most recent call last):
file "g:/study/python/code/book_test/test.py", line 18, in print a.next()
stopiteration
生成器(generator):使用了yield的函式叫做generator
它是特殊的iterator
每次遇到 yield 時,函式會暫停並儲存當前所有的執行資訊(掛起),返回 yield 的值(類似return), 並在下一次執行 next() 方法時從yield下一行繼續執行(重新拾起)。
實現乙個生成器方法1,用生成器函式:
# 用生成器實現斐波那契數列
def fib(max):
n,a,b =0,0,1
while n < max:
yield b
a,b =b,a+b
n = n+1
for i in fib(6):
print(i)
結果:112
358
實現乙個生成器方法2,把列表生成式的換成():
# 列表生成式
lis = [x*x for x in range(10)]
print(lis)
# 生成器
generator_ex = (x*x for x in range(10))
print(generator_ex)
結果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
at 0x000002a4cbf9eba0>
用yield實現「在單執行緒的情況下實現併發運算的效果」:
import time
def consumer(name):
print("%s 準備學習啦!" %name)
while true:
lesson = yield # 沒有send()時候,此處返回none;send()之後,此處返回send()過來的數值
print("開始[%s]了,[%s]老師來講課了!" %(lesson,name))
def producer():
c = consumer('a')
c2 = consumer('b')
c.next()
c2.next()
print("同學們開始上課 了!")
for i in range(10):
time.sleep(1)
print("到了兩個同學!")
c.send(i) # 把乙個值傳送到yield後面
c2.send(i)
producer()
結果:a 準備學習啦!
b 準備學習啦!
同學們開始上課 了!
到了兩個同學!
開始[0]了,[a]老師來講課了!
開始[0]了,[b]老師來講課了!
到了兩個同學!
開始[1]了,[a]老師來講課了!
開始[1]了,[b]老師來講課了!
到了兩個同學!
開始[2]了,[a]老師來講課了!
開始[2]了,[b]老師來講課了!
到了兩個同學!
開始[3]了,[a]老師來講課了!
開始[3]了,[b]老師來講課了!
到了兩個同學!
開始[4]了,[a]老師來講課了!
開始[4]了,[b]老師來講課了!
到了兩個同學!
開始[5]了,[a]老師來講課了!
開始[5]了,[b]老師來講課了!
到了兩個同學!
開始[6]了,[a]老師來講課了!
開始[6]了,[b]老師來講課了!
到了兩個同學!
def consumer():
r = 'here'
while true:
# 1.先執行等號右邊,所以直到第一次跳出函式,也沒有給n1賦值。
# 2.yield r 相當於乙個整體,賦值給它。
n1 = yield r
if not n1:
return
print n1
r = '%d00 ok' % n1
def produce(c):
aa = c.send(none)
n = 0
while n < 5:
n = n + 1
print n
r1 = c.send(n)
print r1
c.close()
c = consumer()
produce(c)
結果:1
1100 ok22
200 ok33
300 ok44
400 ok55
500 ok
下面說明下send執行的順序。
先記住,n1 = yield r這行是從右往左執行的。當第一次send(none)(對應11行)時,啟動生成器,從生成器函式的第一行**開始執行,直到第一次執行完yield(對應第4行)後,跳出生成器函式。這個過程中,n1一直沒有定義。
執行到send(1)時,進入生成器函式,此時,將yield r看做乙個整體,賦值給它。
Python高階專題 可迭代物件協議以及迭代器
1.迭代協議與可迭代物件 只有實現了迭代協議 iter 才可以稱為可迭代物件 2.迭代器 訪問集合內元素的方式,用於遍歷資料,但是無法返回,提供了惰性訪問資料,同時實現了 iter 以及 next 協議 from collections.abc import iterable,iterator it...
python迭代和如何判斷乙個物件是可迭代物件
可以理解為,任意的集合使用for迴圈遍歷 python中,迭代永遠是取出元素本身,而非元素的索引。對於有序集合,有時候會需要取出元素的索引,可以使用python內建的enumerate函式。enumerate函式可以把乙個list變成索引 元素對,這樣就可以在for迴圈中同時迭代索引和元素本身。li...
Python的可迭代物件和迭代器物件
迭代器指的是迭代取值的工具,迭代是指乙個重複的過程,每一次重複都是基於上一次結果而來,迭代提供了一種通用的不依賴索引的迭代取值方式 但凡內建有 iter 方法的物件,都稱為可迭代物件,可迭代的物件 str,list,tuple,dict,set,檔案物件 1.既內建又 next 方法的物件,執行該方...