函数式编程--闭包

函数式编程–闭包


*原理

闭包=环境变量+函数


最简单的闭包

def curve_pie():
    a =25
    def curve(x):
        return a*pow(x,2)
    return curve
f =curve_pie()
print(f(2))

输出结果:
ans=100
检验函数是否闭包

print(f.__closure__)
#环境变量 a=25
print(f.__closure__[0].cell_contents)

输出结果

(0x00000191D32A8228: int object at 0x000000005BE16F40>,)
25

该函数闭包

求解 旅行客问题:

*初始的位置(origin=0),一共行走了3步(step),第一步 为2 ,第二步为3 ,第三步为5,求现在为什么位置(new_pos)?(利用闭包和非闭包的形式求解)

首先利用非闭包形式求解


#非闭包形式
orgian = 0
def go(step):
    global orgian
    new_pos = orgian + step
    orgian = new_pos
    return  orgian
print(go(2))
print(go(3))
print(go(5))

结果:
2
5
10

关键点:

如果这样写
def go(step):
    new_pos = orgian + step
    orgian = new_pos

报错:
UnboundLocalError: local variable ‘orgian’ referenced before assignment
原因是:orgian = new_pos 在python中表示了orgian是一个局部变量,可是你上一步用的orgin是全局变量,冲突了,就报错了。所以必须在orgian前加上global 来定义orgian为全局变量。可是在实际编码中,如果都用global来定义,不具有封装性了。不是特别好。
所以利用闭包的形式来编码,效果比较好。

利用闭包形式求解

#闭包形式
orgian = 0
def f1(pos):
    def f2(step):
        nonlocal pos
        new_pos = pos +step
        pos = new_pos
        return new_pos
    return f2
f = f1(orgian)
print(f(2))
print(f(3))
print(f(5))

结果:
2
5
10
检验是否为闭包形式

f = f1(orgian)
print(f(2))
print(f.__closure__[0].cell_contents)
print(f(3))
print(f.__closure__[0].cell_contents)
print(f(5))
print(f.__closure__[0].cell_contents)

结果:
2
2
5
5
10
10
说明是闭包形式。

关键点:

    def f2(step):
        nonlocal pos
        new_pos = pos +step
        pos = new_pos

利用nonlocal定义pos,为闭包内的全局变量
而且最后不改变origin的值。

你可能感兴趣的:(python)