天天看點

Pyhton函數傳回函數

# -*- coding: utf-8 -*-

def createCounter():
    def add_num():
        n = 0
        while True:
            n = n + 1
            yield n
    y = add_num()
        
    def counter():
        return next(y)
    return counter

# 測試:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('測試通過!')
else:
    print('測試失敗!')
           

Python原函數傳回的函數在原函數執行時并未執行,而是在有需要時執行。

此外,傳回的函數不要引用原函數的任何可能變化的量(如循環控制變量)

在上述Conter例子中

一開始的想法是:

def createCounter():
    a = 1     
    def counter():
        i = a
        a = a + 1
        return i
    return counter
           

但是測試過程中發現可執行i=a,但不能執行a=a+1。即可通路原函數變量,但是不能改變原函數的變量(此時會提示a未定義)。

是以後面想法便是在原函數執行時建立一個從0開始無限整數序列(無限疊代器),這樣每次就可通過next()函數直接得到目前計數的值。

疊代器在這裡就充當計數器的作用。因為每計數一次,疊代器的指針就往後移動一個機關。

繼續閱讀