利用闭包返回一个计数器函数,每次调用它返回递增整数:
# -*- 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()) 这个方法很精妙,将前面的知识点串联起来了。