python从零开始--19 返回函数

返回函数就是将函数作为一个返回对象返回,因为对于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





阅读更多
个人分类: python从零开始
上一篇python从零开始--17 函数之map reduce filter sorted
下一篇python从零开始--18 global and nonlocal的作用域
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭