返回函数
闭包:
在函数A中又定义了函数B,并且,内部函数B可以引用外部函数A的参数和局部变量,当A返回函数B时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
利用闭包返回一个计数器函数,每次调用它返回递增整数:
第一种方法:
# -*- coding: utf-8 -*- def createCounter(): n=0 def counter(): nonlocal n #必须加nonlocal n=n+1 return n 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('测试失败!'
总结:
这段代码如果不加nonlocal,会报错,这是因为对于createCounter函数,n是局部变量,对于counter函数,n是非全局的外部变量。当在counter中对n进行修改时,会将n视为counter的局部变量,屏蔽掉createCounter中对n的定义;如果仅仅在counter中对n进行读取,则不会出现这个错误。
而写成列表则不会报错了, 改变列表L中第一个元素的值,但并没有改变列表L的内存地址。
第二种方法:
def createCounter(): L=[0] # 列表L的内存地址在初次调用时已经给定,且L[0]即第一个元素指向整数0 def counter(): L[0]+=1 #改变列表L中第一个元素的值,但并没有改变列表L的内存地址 return L[0] return counter