關於yield這個表示式,只是在以前用的時候網上搜了幾篇文章看了一下,大概理解如
何去使用,但yield執行原理其實還是不大明白,今天在次總結一下:
1. 如果乙個函式中使用了yield,那麼這個函式就變成了乙個生成器。生成器是可以迭代的,但只可以讀取它一次,因為用的時候才生成。
2. 生成器能夠迭代是因為有乙個next()方法,原理就是通過重複呼叫這個方法來獲取值,直到捕獲乙個異常。
3. yield 是乙個類似 return 的關鍵字,迭代一次遇到yield時就返回yield後面(右邊)的值。重點是:下一次迭代時,從上一次迭代遇到的yield後面的**(下一行)開始執行。
4. 帶有yield的函式不僅僅只用於for迴圈中,而且可用於某個函式的引數,只要這個函式的引數允許迭代引數。比如array.extend函式,它的原型是array.extend(iterable)。
5. send(msg)與next()的區別在於send可以傳遞引數給yield表示式,這時傳遞的引數會作為yield表示式的值,而yield的引數是返回給呼叫者的值。——換句話說,就是send可以強行修改上乙個yield表示式值。
6. 第一次呼叫時必須先next()或send(none),否則會報錯,send後之所以為none是因為這時候沒有上乙個yield(根據第8條)。可以認為,next()等同於send(none)。
**示例
# -*-coding: utf-8 -*-
defyield_test
(n):
for i in range(n):
yield call(i)
print("i=",i)
#做一些其它的事情
print("do something.")
print("end.")
defcall
(i):
return i*2
#使用for迴圈
for i in yield_test(5):
print(i,",")
結果:>>>
0 ,
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
do something.
end.
>>>
**示例2
>>> def t1():
print '1'
x = yield 'hello'
print '2', 'x = ', x
y = 5 + (yield x)
print '3', 'y = ', y
結果>>> t = t1()
>>> t.next()
1'hello'
>>> t.send(5)
2 x = 5
5>>> t.send(2)
3 y = 7
traceback (most recent call last):
file "", line 1, in t.send(2)
stopiteration
Python中yield表示式的使用
關於yield這個表示式,只是在以前用的時候網上搜了幾篇文章看了一下,大概理解如 何去使用,但yield執行原理其實還是不大明白,今天在次總結一下 coding utf 8 defyield test n for i in range n yield call i print i i 做一些其它的事...
協程與yield表示式
在函式內,yield語句還可以用作出現在賦值運算子右邊的表示式,例如 def receiver print ready to receive while true n yield print got s n以這種方式使用yield語句的函式稱為協程,它的執行是為了響應傳送給它的值。它的行為也十分類似...
yield表示式, 四種形式
yield表示式,四種形式 a.不接受輸入值或者輸入值是none yield 1 b.接受輸入值 s yield 1 c.接受輸入,但不返回資料,這樣預設返回none s yield d.既不接受輸入,也不返回值,預設返回none yield 第一種 當函式呼叫到yield時,返回yield的右邊經...