超詳細的生成器的執行過程,yield的作用

2021-10-21 10:53:35 字數 2685 閱讀 8385

前言

在python中,一邊迴圈一邊計算的機制,稱為生成器(generator),可以大大的節省記憶體空間。

如果得到乙個生成器呢?

# 這是列表推導式

list1 =

[x for x in

range(10

)]print

(list1)

而想要得到乙個生成器,只要將兩邊的「」換成「()」即可

g =

(x*3

for x in

range(10

))print

(type

(g)# 得到的型別是生成器

但是當我們想要把生成器裡的數字列印出來時,會出現一串記憶體位址。

print

(g)#at 0x000001df35d5bdd0>

如果我們想得到生成器中的數字,我們需要呼叫它,有兩種方法。

1.__next__()方法

print

(g.__next__())

# 0print

(g.__next__())

# 3print

(g.__next__())

# 6

2.next()函式

print

(next

(g))

#9

yield的作用

# 1. 只要函式中有yield,那麼函式就變成了生成器

deffunc()

: n =

0while

true

: n +=

1yield n # yield 相當於將n返回給g + 暫停

g = func(

)print

(g.__next__())

>>

>

1

下面來一道例項:生成斐波那契數列。

斐波那契數列指的是這樣乙個數列:

0、1、1、2、3、5、8、13、21、34、……

這個數列從第3項開始,每一項都等於前兩項之和。

# 2.斐波那契數列

deffib

(length)

: a =

0 b =

1 n =

0while n < length:

a, b = b, a + b

yield b

n +=

1# 下一次呼叫從此處開始執行

return

"超過次數!"

# 會返回給報錯原因stop iteration中 (stopiteration: 超過次數!)

result = fib(8)

print

(result.__next__())

print

(result.__next__())

print

(result.__next__())

print

(result.__next__())

print

(result.__next__())

# 呼叫超過length的次數將會報錯

列印結果:

123

58

下面我將貼出乙個例子,並分析它的執行過程。

#這是原**

deffoo()

: n =

0while

true

: temp =

yield n

print

("temp"

, temp)

n +=

1# 呼叫

f = foo(

)foo1 = f.send(

none

)print

("foo1:"

, foo1)

foo2 = f.send(

"foo2"

)#send函式相當於給yield傳值

print

("foo2:"

, foo2)

以下是分析過程:(第一輪)

在第②步中,**並不會執行函式的部分,由於函式中yield出現,因此會直接跳到第③步

第二輪:

1有乙個要注意的地方就是為什麼第一次要send(none)呢?

由於第一次還沒有進入到迴圈中,無法將值傳給yield,因此會報錯,如下:

php的Generator生成器及yield

官方文件 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。生成器允許你在foreach 塊中寫 來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫乙個生成器函式,就像...

生成器 PHP的生成器yield 原創

在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...

Python的生成器

生成器是python新引入的概念,由於歷史原因,它也叫做簡單生成器。它和迭代器可能近幾年來引入的最大的兩個特徵。但是,生成器的概念則要更高階一些,需要花費一些功夫才能理解它是如何工作的以及有什麼用處。生成器可以幫助讀者寫出優雅的 當然,編寫任何程式時不使用生成器也是可以的。生成器是一種普通的函式語法...