Python 返回函数

关于返回函数即返回值为函数

详见http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431835236741e42daf5af6514f1a8917b8aaadff31bf000#0


关于闭包:是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造的环境也不例外

详见https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)


先看一个例子,分析闭包的:

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

分别执行 f1(),f2(),f3()后返回的结果均为9

分析:例子中fs存储的是函数,每次都创建一个新的函数,函数中的i取自count()中for循环的i,在执行最后一句赋值后,将三个函数分别赋给f1,f2,f3;只有当执行f1()后,才会执行该函数,同时取出变量i,这个变量指向的是for存储的变量,当for语句执行完后,此i变量不会消失(这是Python的特性,见http://python.jobbole.com/81274/


为了判断创建的f函数没有存储i,而是存储i的引用,可以在return fs前面加上一句,如下所示:

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    print(i)
    i=i+2
    return fs

然后执行,输出f1()的结果是25,显然i的值变为了5,那么就可以得出在f()函数确实没有存储i,那么如何将i存入,而不让i的结果随着i的变化而变化呢,这需要存储i的值而不是i的引用,使用参数,但是为了存储函数,需要另定义函数,如下:

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) 
    return fs



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值