>>> def lazy_sum(*args): #可变参数
... def sum():
... ax = 0
... for i in args: #调用外部函数的参数
... ax = ax + i
... return ax
... return sum --这里返回的是个函数
...
>>>
>>>
>>> lazy_sum(1, 3, 5, 7)
<function lazy_sum.<locals>.sum at0x2b8091d87268>
>>> lazy_sum(1,3, 5, 7)()
16
>>> f =lazy_sum(1, 3, 5, 7)
>>> f
<function lazy_sum.<locals>.sum at0x2b8091d87268>
>>> f()
16
注意:当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1 == f2
False
看下闭包的问题
>>> def count():
... fs = []
... for i in range(1, 4):
... def f():
... return i*i
... fs.append(f)
... return fs
...
>>> f1, f2, f3 = count() --变量i都引用的是3
>>>
>>> f1
<function count.<locals>.f at0x2b8091d87488>
>>> f1()
9
>>> f2()
9
>>> f3()
9
回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
改写代码
>>> def count():
... def f(j):
... return lambda:j*j --引用j变量,lambda匿名函数不用传参
... fs = []
... for i in range(1, 4):
... fs.append(f(i))
... return fs
>>> f1()
1
>>> f2()
4
>>> f3()
9
本文出自 “90SirDB” 博客,请务必保留此出处http://90sirdb.blog.51cto.com/8713279/1820912
原文地址:http://90sirdb.blog.51cto.com/8713279/1820912