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