利用閉包返回一個計數器函數,每次調用它返回遞增整數:
# -*- coding: utf-8 -*-
def createCounter():
def counter():
return 1
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('測試失敗!')
在閉包中不能修改外部作用域的局部變量,所以在外層函數設置局部變量,到內層函數再賦值返回會拋出錯誤: UnboundLocalError: local variable 'n' referenced before assignment
1.容器法,將變量設置為一個容器,通過下標來修改
def f(): s=[0] def f1(): s[0]=s[0]+1 return s[0] return f1 c=f() print(c(),c(),c())>>>1,2,3 這里不明白為什么將變量設置為一個容器便能進行更改,請大哥們賜教。 2.nonlocal,適用於嵌套內部函數修改外部函數局部變量
def f(): n=0 def f2(): nonlocal n n=n+1 return n return f2 c=f() print(c(),c(),c())>>>1,2,3
3.global,適用於函數內部修改全局變量 n=0
def f(): def f2(): global n n=n+1 return n return f2 c=f() print(c(),c(),c())
4.生成器,返回遞增整數數列生成器
def f(): def f1(): n=1 while True: yield n n=n+1 it = f1() def f2(): return next(it) return f2 c=f() print(c(),c(),c()) 這個方法很精妙,將前面的知識點串聯起來了。
在閉包中不能修改外部作用域的局部變量,所以在外層函數設置局部變量,到內層函數再賦值返回會拋出錯誤: UnboundLocalError: local variable 'n' referenced before assignment
1.容器法,將變量設置為一個容器,通過下標來修改
def f(): s=[0] def f1(): s[0]=s[0]+1 return s[0] return f1 c=f() print(c(),c(),c())>>>1,2,3 這里不明白為什么將變量設置為一個容器便能進行更改,請大哥們賜教。 2.nonlocal,適用於嵌套內部函數修改外部函數局部變量
def f(): n=0 def f2(): nonlocal n n=n+1 return n return f2 c=f() print(c(),c(),c())>>>1,2,3
3.global,適用於函數內部修改全局變量 n=0
def f(): def f2(): global n n=n+1 return n return f2 c=f() print(c(),c(),c())
4.生成器,返回遞增整數數列生成器
def f(): def f1(): n=1 while True: yield n n=n+1 it = f1() def f2(): return next(it) return f2 c=f() print(c(),c(),c()) 這個方法很精妙,將前面的知識點串聯起來了。