内部函数
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=1
与y=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了。因此func1
、func2
、func3
携带的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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。