Python 高階特性 生成器和迭代器

2021-08-15 14:02:21 字數 3015 閱讀 5468

生成器generator

目的:list容量太大佔太多記憶體而操作時卻僅僅訪問前幾個元素,generator可以通過迴圈不斷推算出後面的元素,邊迴圈邊計算,節省大量空間;

建立乙個generator:

>>>vlist=[a*a for a in range(3)]

>>>vlist

[0,1,4]

>>>vgenerator=(b*b for b in range(3))

>>>vgenerator

at 0x0000001c9c7702620>

列印generator的值:

>>>next(vgenerator)

0>>>next(vgenerator)

1>>>next(vgenerator)

4

>>>for i in vgenerator:

... print(i)

...0

14

如果推算的演算法比較複雜,用類似列表生成式的for迴圈無法實現的時候,還可以用函式來實現,這是乙個generator:

>>>def fib(max):

... n, a, b = 0, 0, 1

... while n < max:

... yield b

... a, b = b, a + b

... n = n + 1

... return 'done'

...

generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

>>>def odd():

... print('step 1')

... yield 1

... print('step 2')

... yield(3)

... print('step 3')

... yield(5)

...

>>> o = odd()

>>> next(o)

step 1

1>>> next(o)

step 2

3>>> next(o)

step 3

5>>> next(o)

traceback (most recent call last):

file "", line 1, in stopiteration

用for迴圈呼叫generator時,發現拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲stopiteration錯誤,返回值包含在stopiteration的value中:

>>> g = fib(6)

>>> while true:

... try:

... x = next(g)

... print('g:', x)

... except stopiteration as e:

... print('generator return value:', e.value)

... break

...g: 1

g: 1

g: 2

g: 3

g: 5

g: 8

generator return value: done

普通函式呼叫直接返回結果,generator函式的「呼叫」實際返回乙個generator物件。

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

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

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

可以使用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

可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator。例如生成器generator.

可以使用isinstance()判斷乙個物件是否是iterator物件:

(將上述**括號裡面的iterable改為iterator)

把list、dict、str等iterable變成iterator可以使用iter()函式:

>>> isinstance(iter(), iterator)

true

>>> isinstance(iter('abc'), iterator)

true

python的迭代器iterator物件表示的是乙個資料流,iterator物件可以通過next()函式呼叫並不斷返回下乙個資料,直到沒有下乙個資料丟擲stopiteration錯誤,這個資料流可看作有序數列,但我們卻不能知道這個有序數列的長度,只能通過next()函式不斷計算出所需的下乙個資料,甚至可以表示乙個無限大的資料流,例如 全體自然數,而list永遠不能儲存全體自然數。



python中圍繞yield的生成器和迭代器詳解

首先,如果你還沒有對yield有個初步分認識,那麼你先把yield看做 return 這個是直觀的,它首先是個return,普通的return是什麼意思,就是在程式中返回某個值,返回之後程式就不再往下執行了。看做return之後再把它看做乙個是生成器 generator 的一部分 帶yield的函式...

生成器高階

def generator print 123 count yield 1 print count print 456 yield 2g generator ret g.next print ret ret g.send 套你大象 send的效果與next一樣 send在獲取下乙個值時,會在上乙個y...

Python高階 生成器(Generators)

迭代器是乙個讓程式設計師可以遍歷乙個容器 特別是列表 的物件。然而,乙個迭代器在遍歷並讀取乙個容器的資料元素時,並不會執行乙個迭代。維基百科 可迭代物件 iterable python中任意的物件,只要它定義了可以返回乙個迭代器的iter方法,或者定義了可以支援下標索引的getitem方法 這些雙下...