返回函数就是将函数作为一个返回对象返回,因为对于python而言,一切皆对象,函数本身也是一个对象。
这里只初步理解一下“返回函数”,后面在研究闭包的时候,再做深一步探究,为什么要需要返回函数。
(关于闭包,可以参考一下知呼上的这篇讨论,https://www.zhihu.com/question/25950466)
from functools import reduce
def add_func(x, y):
return x + y
def lazy_sum(*args): # lazy_sum将正真计算sum的函数 sum_func包括在自己的函数体内,并将sum_func所需的参数当作自己的入参;
def sum_func(): # 真正计算SUM的的函数, 它无须参数
redu = reduce(add_func, args)
return redu
return sum_func # 返回子函数名称,其实是一个构造好的函数对象,包括计算所需的参数值,只等使用的时候进行正式计算
f = lazy_sum(*[1, 4, 6, 7, 9])
print(f) # 打印的是函数对象的地址
print(f()) # 这里进行的调用,并进行了计算
<function lazy_sum.<locals>.sum_func at 0x0000000000B1F400>
27
另外一个例子“计数器”,这个感觉更有实际意义:
def counter():
j = 0
def g():
nonlocal j # 定义j是用的外层的变量,非g()下的局部变量
j += 1
return j
return g
c1 = counter()
c2 = counter()
print(c1(), c1(), c1(), c2(), c2(), c2())
Connected to pydev debugger (build 173.4674.37)
1 2 3 1 2 3
计数器带参数改造:
def createCounter():
fl = []
def counter(j):
def g():
return j
return g
for i in range(1,10):
fl.append(counter(i))
return fl
c = createCounter()
for i in c:
print(i())
1
2
3
4
5
6
7
8
9