使用生成器建立新的迭代模式

2021-10-01 23:41:39 字數 1725 閱讀 8259

你想實現乙個自定義迭代模式,跟普通的內建函式比如 range() , reversed() 不一樣。

如果你想實現一種新的迭代模式,使用乙個生成器函式來定義它。下面是乙個生產

某個範圍內浮點數的生成器:

def

frange

(start, stop, increment)

: x = start

while x < stop:

yield x

x += increment

為了使用這個函式,你可以用 for 迴圈迭代它或者使用其他接受乙個可迭代物件的

函式 (比如 sum() , list() 等)。示例如下:

>>

>

for n in frange(0,

4,0.5):.

..print

(n)...

00.5

1.01.5

2.02.5

3.03.5

>>

>

list

(frange(0,

1,0.125))

[0,0.125

,0.25

,0.375

,0.5

,0.625

,0.75

,0.875

]>>

>

乙個函式中需要有乙個 yield 語句即可將其轉換為乙個生成器。跟普通函式不同的是,生成器只能用於迭代操作。下面是乙個實驗,向你展示這樣的函式底層工作機制:

>>

>

defcountdown

(n):..

.print

('starting to count from'

, n)..

.while n >0:

...yield n..

. n -=1.

..print

('done!').

..>>

>

>>

> c = countdown(3)

>>

> c

>

>>

>

# run to first yield and emit a value

>>

>

next

(c)starting to count from33

>>

>

# run to the next yield

>>

>

next

(c)2

>>

>

# run to next yield

>>

>

next

(c)1

>>

>

# run to next yield (iteration stops)

>>

>

next

(c)done!

traceback (most recent call last)

: file ""

, line 1,in

stopiteration

乙個生成器函式主要特徵是它只會回應在迭代中使用到的 next 操作。一旦生成器

函式返回退出,迭代終止。我們在迭代中通常使用的 for 語句會自動處理這些細節,所

以你無需擔心。

00404 使用生成器建立新的迭代模式

你想實現乙個自定義迭代模式,跟普通的內建函式比如 range reversed 不一樣。生成器函式 usr bin env python deffrange stop,start 0,increment 1 x start while x stop yield x x increment for n...

使用生成器建立新的迭代器

實現乙個自定義的迭代模式,使其區別於常見的內建函式 range,reversed等 實現生成器 def frange start,stop,increment x start while x stop yield x x increment 迭代呼叫 for n in frange 1,10,0.5...

生成器模式 建立英雄

builder 為建立乙個product物件的各個部件定義指定的抽象方法,並提供乙個返回該product的方法。concretebuilder 實現builder的介面以構造和裝配該產品的各個部件。director 導演類,用於指導具體構建者如何構建產品,控制呼叫先後次序,並向呼叫者返回完整的產品類...