# -*- 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()函數直接得到目前計數的值。
疊代器在這裡就充當計數器的作用。因為每計數一次,疊代器的指針就往後移動一個機關。