python-学习笔记 内部函数

内部函数

Python可以在函数内部再定义一个函数。这个定义的内部函数可以引用外部函数的参数和局部变量。
事实上,内部函数还可以在其中再定义内部函数,实现内部函数多重嵌套。
例如:

def fun_outer(x, y):
    def fun_inner(z):
        def fun_inner_inner(h):
            return x+y+z+h
        return fun_inner_inner(100)
    return fun_inner(20)

print fun_outer(1, 2)

返回函数本身

函数本身也是一个对象。因此我们可以在函数内将一个内部函数返回。返回该函数的时候,携带了该内部函数引用的外部函数参数和局部变量。

def fun_outer(x, y):
    def fun_inner(z):
        def fun_inner_inner(h):
            return x+y+z+h
        return fun_inner_inner(100)
    return fun_inner(20)

f =  fun_outer(1, 2)
print f

打印的结果为<function fun_inner at 0x10d951f50>. 此时fun_outer(1, 2)得到的是一个函数对象,该函数对象携带了两个参数值,即x=1y=2
如何让它进一步计算呢,此时我们再执行f(3)就会返回结果6

每次返回的函数都是不同的对象

f1 = fun_outer(1, 2)
f2 = fun_outer(1, 2)
print f1
print f2

print的结果为:

<function fun_inner at 0x102973f50>
<function fun_inner at 0x102973f50>

内部函数本身被返回时,所携带的参数或局部变量时return那一刻的值

例如在函数内有循环,内部函数引用的循环变量。

def fun_outer(x, y):
    funcs = []
    for i in range(0,3):
        def fun_inner():
            return x+y+i
        funcs.append(fun_inner)
    return funcs

func1, func2, func3 = fun_outer(1, 2)
print func1(),func2(),func3()

打印结果竟然三个函数都是5.其实这时候func_outer函数在返回一个函数列表的时候,i已经循环到2了。因此func1func2func3携带的i参数都已经是2了。因此最终计算结果都是5.
如何实现在有循环变量的时候,返回的函数携带的变量都是循环当时的值呢?
方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变.

def fun_outer(x, y):
    funcs = []
    for i in range(0,3):
        def fun_inner(c):
            def fun_inner_inner():
                return x+y+c
            return fun_inner_inner
        funcs.append(fun_inner(i))
    return funcs

func1, func2, func3 = fun_outer(1, 2)
print func1(),func2(),func3()

打印结果:3 4 5

    原文作者:xcwong
    原文地址: https://segmentfault.com/a/1190000007690559
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞