print ("--------------------分割线------------------")
def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
func = lazy_sum(1, 3, 5, 6)
print( func )
print( func() )
func1 = lazy_sum(2, 3, 4, 5)
func2 = lazy_sum(2, 3, 4, 5)
print( func1==func2 )
print ("--------------------分割线------------------")
'''
在上面lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数
lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都
保存在返回的函数中,这种称为“闭包(Closure)”
注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回
了一个函数后,其内部的局部变量还被新函数所引用
'''
def count():
list_a = []
for i in range(1, 4):
def fun():
return i*i
list_a.append(fun)
return list_a
list_b = list( count() )
for func in list_b:
print( func(),end = ' ' )
print()
'''
在上面例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都
返回了, 调用func()的结果不是1,4,9。正确结果全部都是9!,原因是返回
的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的
变量i已经变成了3,因此最终的结果是9.
!!!返回闭包时牢记一点:返回函数尽量不要引用任何循环变量,或者后续会发生
!!!变化的变量
'''
def count1():
def fun(j):
def g():
return j*j
return g
list_a = []
for i in range(1, 4):
list_a.append( fun(i) )
return list_a
fun1,fun2,fun3 = count1()
print( fun1(), fun2(), fun3() )
print ("--------------------分割线------------------")
def createCounter():
i = [0]
def counter():
i[0] = i[0] + 1
return i[0]
return counter
aaa = createCounter()
print( aaa(), aaa(), aaa() )
'''
解析:
外部变量i=[0],每次调用内部函数,i都指向这个只有一个元素的list
牢记list是可变对象,i指向list这个关系在每次调用中是没有发生改变的
但是list内部第一个元素i[0]指向的数字在每次调用后已经加1了
第一次调用,(内部函数,i=[0]),i[0]+1,i[0]=1,返回1
下一次调用,(内部函数,i=[1]),i[0]+1,i[0]=2,返回2
(注意这里i还是指向原来的那个list,内部函数并没有改变外部变量i的指向)
'''
def createCounter1():
i = 0
def counter():
nonlocal i
i = i + 1
return i
return counter
bbb = createCounter1()
print( bbb(), bbb(), bbb() )
'''
解析:nonlocal适用于嵌套函数中内部函数修改外部变量的值,表示这个变量
不是局部变量空间的变量,需要向上一层变量空间找这个变量。
'''