函数式编程
闭包
函数在其他很多编程语言中是一段可执行的代码,并不是对象
如c#
在python中一切皆对象
可以把函数当作另外一个函数的参数,传递到另外的函数里
还可以把函数当作另外一个函数的返回结果。
闭包就是在定义时的环境变量的本体,被调用时不会被函数变量的变动影响
闭包= 函数 + 环境变量(函数定义时候)
变量一定要在函数内才可以
如果他是环境变量就还是会被变动影响
闭包的定义就是返回现场的环境
def curve_pre():
a = 25
def curve(x):
return axx
return curve
a = 10
f = curve_pre()
print(f.closure) #闭包 #f变为一个对象,不仅仅是一个函数了
print(f.closure[0].cell_contents) #闭包定义时的环境变量
print (f(2))
def f1():
a = 10
def f2():
a = 20 # a此时将被python认为是一个局部变量
return a
return f2
f = f1()
print (f)
print (f.closure)
输出
<function f1..f2 at 0x0000016548D07AE8>
None
此时,a被变为局部变量,所以闭包不成立,与f2内部是否返回结果没有关系
主要是a这个环境变量不能在f2内再被赋值。不然就会变成局部变量闭包不成立。
函数引用内部变量就是闭包
origin = 0
def go(step):
global origin #global 定义全局变量
new_pos = origin +step
origin = new_pos #函数内如果有赋值,那么函数不会调用外部全局变量。
return origin
print(go(2))
print(go(3))
print(go(6))
不使用闭包进行对函数的保存再使用
origin = 0
def factory(pos):
def go(step):
nonlocal pos #强行否定局部变量
new_pos = pos+step
pos = new_pos
return new_pos
return go
tourist=factory(origin)
print(tourist(2))
print(tourist(3))
print(tourist(6))
使用闭包对函数变量的保存
并且,不改变全局变量
闭包是函数式编程的一种应用