Python中yield表示式的使用

2021-08-17 01:30:42 字數 1688 閱讀 7511

關於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的右邊經...