python可以返回一个函数
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
这是一个典型的返回函数的,这个操作的目的是实现延迟计算,在输入f()之后才会计算出值
f = lazy_sum(1, 3, 5, 7, 9)
f()
python里面有这样的逻辑,x=abs可以用x取代abs函数,此时x代表一个函数。用x(y)就可以得到y的绝对值,x=abs()则是把abs的返回值给x,这时x就不是函数而是一个值了。
在上面的逻辑里面,x=lazy_sum(1,3,5,7,9),这个时候x是sum这个函数,所以在后面使用f()相当于使用了sum()
这个很容易理解,但是如果复杂一点呢?
在廖雪峰老师的教程里讲到了一个延迟计算的问题,具体问题看这里:点击传送
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
这里由于计算的推迟导致三个f()函数的参数i的值都变成了3。
好,这个也不难理解,那么我们试着来修改这个问题呢
def count():
fs = []
for i in range(1, 4):
def f(i):
return i*i
fs.append(f(i))
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
一开始我是这么写的,但是错了错误信息:
Traceback (most recent call last):
File "index.py", line 10, in
print f1(), f2(), f3()
TypeError: 'int' object is not callable
分析之后发现原因,f1就是f(1),所以这里使用f1()就出了问题,也就是说f1一开始就是个值,自然不能当成函数来使用,修改方法有2种
def count():
fs = []
for i in range(1, 4):
def f(i):
return i*i
fs.append(f(i))
return fs
f1, f2, f3 = count()
print f1, f2, f3
def count():
fs = []
for i in range(1, 4):
def f(i):
return lambda:i*i
fs.append(f(i))
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
个人觉得第二种方法高级一点,这里解释一下,f1仍然是f(1),但是,这里可以继续使用f1(),因为在f(i)内部设置了lambda函数
,这个就比较巧妙了。
总结下来,在使用返回函数的时候一定眼仔细分析返回的是函数还是值