函数式编程中的一种---闭包
1、python中一切皆对象
例如:(1)函数可作为一个对象
(2)可作为一个函数的参数,传递到另外的函数里
(3)把一个函数当做另外一个函数的返回结果
案例:def demo():
pass
print(type(demo))
结果:<class 'function'>
2.闭包
定义:由函数和环境变量构成案例1:
def a():
m =25
def b(x):
return m*x*x
return b
m = 10
f = a()
print(f.__closure__)
print(f.__closure__[0].cell_contents)
print(f(2))
结果:
(<cell at 0x000001CCE3FA0F78: int object at 0x0000000056D1D1F0>,)
25
100
案例2:
def demo():
a =10
def demo2():
a =20
print(a)
print(a)
demo2()
print(a)
demo()
结果:10 20
3.闭包的常见误区
案例1:
def demo():
a = 10def demo2():
# a为局部变量
a = 20
return a
return demo2
f = demo()
print(f)
print(f.__closure__)
结果:
<function demo.<locals>.demo2 at 0x000002026DCF5AE8>
None
案例2:
def demo():
a = 10
def demo2():
# a为局部变量
# a = 20
return a
return demo2
f = demo()
print(f)
print(f.__closure__)
结果:
<function demo.<locals>.demo2 at 0x00000284F14B5AE8>
(<cell at 0x00000284F0D30F78: int object at 0x000000005874D010>,)
结论:a被python认为是一个局部变量案例3:求距离
x = 0
def distance(step):
dis = x + step
x = dis
return x
print(distance(1))
print(distance(2))
print(distance(3))
结果:报错
案例4:x = 0
def distance(step):
global x
dis = x + step
x = dis
return dis
print(distance(1))
print(distance(2))
print(distance(3))
结果:1 3 6总结:加global将x声明为全局变量(保证x不能被同时赋值)
案例5:(使用闭包解决问题)
x = 0
def distance(pos):
def go(step):
#声明pos不是本地变量
nonlocal pos
dis = pos + step
pos = dis
return dis
return go
t = distance(x)
print(t(2))
print(t(3))
print(t(5))
结论:2 5 10
总结:使用关键字nonlocal声明pos为非本地变量