码迷,mamicode.com
首页 > 其他好文 > 详细

返回函数

时间:2017-05-24 22:49:38      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:参数调用   pre   通过   sum   变量   创建   函数名   nbsp   range   

正常的函数如下所示:

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

但如果函数返回值是一个函数,示例如下:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

可以看出被返回的函数不带参数,但是它可以引用外部函数如lazy_sum的参数,返回函数名,该函数不立即执行,而是等调用时,使用函数名+()再执行,同样的参数调用返回的函数都是一个新的函数。

调用示例如下:

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>

 可以看出直接调用lazy_sum(1,3,5,7,9)只会返回求和函数sum,但是返回的函数中又包含了调用时的参数、变量,如1,3,5,7,9,因此使用f()调用时得到25的结果,这种结构称为闭包。

>>> f()
25

返回函数不仅可以引用外部函数的参数,而且还可以引用外部函数内部定义的局部变量,因此如果返回函数中引用的变量发生变化,会导致出问题,如下例所示:

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

f1, f2, f3 = count()

 该例返回了一个函数列表,含有三个函数,调用时因为返回的函数并没有立即执行,而是等到调用了f()才执行,所以实际结果是   

>>> f1()
9
>>> f2()
9
>>> f3()
9

就是因为等三个函数都返回时,i变成了3,所以最终结果都是9,因此返回函数不能引用任何后续会发生变化的变量。

如果一定要引用循环变量,那么需要再创建一个函数A,循环变量放在该函数A的外围,用循环变量作为该函数A的参数,而该函数A内部返回函数B,引用函数A的参数,此时因为外部循环得到的值是通过参数输入到函数A中,该参数已经固定,不会变化。

 

  

 

  

返回函数

标签:参数调用   pre   通过   sum   变量   创建   函数名   nbsp   range   

原文地址:http://www.cnblogs.com/vonkimi/p/6901042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!