1. 程式人生 > >python 中 yield 的使用

python 中 yield 的使用

python中yield在函式中的使用

正是因為函式含有這個yield,所以,該函式不再是普通的函式,而是生成器函式(generator function)。下面通過小例子來說明一下這個內建函式的特性:

1、直接執行函式並不會執行。

a = 0
def add_(initial, k):
    for i in range(k):
        initial = initial + 1
        print(initial)
        yield initial
add_(a, 10)

從執行結果發現,並沒有輸出initial的值,說明該函式並沒有直接呼叫執行。

2、直接列印該函式會返回一個生成器物件。

print(add_(a, 10))
<generator object add_ at 0x000002457504CBA0>

3、可通過for迴圈迭代執行。

a = 0
def add_(initial, k):
    for i in range(k):
        initial = initial + 1
        print(initial)
        yield initial
add_(a, 4)
print(add_(a, 4))
for j in add_(a, 4):
    print('j:', j)
<generator object add_ at 0x000002A92F81CBA0>
1
j: 1
2
j: 2
3
j: 3
4
j: 4

Process finished with exit code 0

從輸出結果可以得知,每次函式執行到yield函式時會終止函式的執行,並保留變數initial的值,通過for迴圈再次執行該函式時,會從上次執行到的地方跳過yield繼續執行。

總結:yield 的作用就是把一個函式變成一個 generator,帶有 yield 的函式不再是一個普通函式,Python 直譯器會將其視為一個 generator,呼叫 add_(a, 4)不會執行add_函式,而是返回一個 iterable 物件。在 for 迴圈執行時,每次迴圈都會執行 add_函式內部的程式碼,執行到 yield initial 時,add_函式就返回一個指定變數的迭代值,在示例中,這個指定的變數為initial,下次迭代時,程式碼從 yield initial的下一條語句繼續執行,而函式的本地變數看起來和上次中斷執行前是完全一樣的,於是函式繼續執行,直到再次遇到 yield。

該方法可用於for迴圈迭代獲取資料,為模型本身節省了記憶體空間與運算時間。