python返回函数的一点记录

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函数

,这个就比较巧妙了。

总结下来,在使用返回函数的时候一定眼仔细分析返回的是函数还是值

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值