python 一切皆对象: 如 python中一个函数可以作为另外一个函数的参数,传递
# 闭包
# 闭包 = 函数 + 环境变量(函数定义时候)
def curve_pre():
a = 25
def curve(x):
#print('This is curve function')
return a*x*x
return curve
a = 10
f = curve_pre() # 此处f是curve()函数
# f() # This is curve function
print(f(2)) # 100
# 在这里函数curve()和函数curve_pre()形成了闭包, f(2)的值不会受函数curve_pre()外部的变量影响
# 闭包的环境变量 保存位置
print(f.__closure__) # (,) |
# 取闭包的参数值
print(f.__closure__[0].cell_contents) # 25
# 一个示例: 此处的f1()不是闭包
def f1():
a = 10
def f2():
# a 此时被python认为是局部变量 ,闭包将不存在
a = 20
print('f2()定义', a) # 20
print('f1()打印', a) # 10
f2()
print('调用f2()后', a) # 10
问题:
有一个旅行者,我们要检测其旅行长度
起点x = 0
比如他走3步, result = 3
比如他又走5步, result = 8
比如他走6步, result =14
# 不用闭包解决
origin = 0
def go1(step):
global origin
new_pos = origin + step
origin = new_pos
return new_pos
print(go1(3)) # 3
print(go1(5)) # 5
print(go1(6)) # 8
# 使用闭包解决
origin = 0
def sum_walk(pos):
def walk(step):
nonlocal pos
new_pos = pos + step
pos = new_pos
return new_pos
return walk
s = sum_walk(origin)
print(s(2)) # 2
print(origin) # 0
print(s(5)) # 7
print(origin) # 0
# 由此可见,相比一般函数而言 闭包不会引起全局变量的改变
# 也可以使用 s.__closure__[0].cell_contents验证
闭包知识函数式编程的一种应用