python基礎 可迭代物件和迭代器和生成器

2021-09-02 01:33:25 字數 3997 閱讀 3734

參考自:

參考自:

可迭代物件(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()函式可以把listdictstriterable變成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 方法的物件,執行該方...