文章内容:
1.函数式编程——闭包的意义及注意事项
2.如何简单地用闭包去解决一个问题
#与有些语言不同的是,在python中,一切皆对象
def curve_pre():
a=12
def curve(x):
return a*x*x
return curve
f=curve_pre()#在python中,一切皆对象
print(f(2))#48,f(2)==curve(2)
#闭包的现象
#闭包=函数+环境变量
def curve_pre():
a=12#环境变量
def curve(x):
return a*x*x
return curve
a=10#################
f=curve_pre()
print(f.__closure__)#(<cell at 0x000000000BB3E528: int object at 0x000000006978C850>,)
print(f.__closure__[0].cell_contents)#12
print(f(2))#48
#闭包的意义:保存一个环境,不受外部影响
#闭包的注意事项
def f1():
a=10
def f2():
a=20#局部变量不会影响到外部的变量
print(a)
print(a)
f2()
print(a)
f1()
#10
#20
#10
#########################
def f1():
a=10
def f2():
a=20
f2()
f=f1()#f为空值,因为没有返回任何结果
print(f.__closure__)#AttributeError: 'NoneType' object has no attribute '__closure__'
def f1():
a=10
def f2():
a=20
return a
f=f1()#f为10,返回了a的值
print(f.__closure__)#AttributeError: 'int' object has no attribute '__closure__'
def f1():
a=10
def f2():
a=20
return f2()
f=f1()#f为f2()
print(f.__closure__)#AttributeError: 'NoneType' object has no attribute '__closure__'
#########################
def f1():
a=10
def f2():
a=20
c=2*a
return c
return f2()
f=f1()
print(f)#40,这不是一个闭包
#把上面调整成闭包
def f1():
a=10
def f2():
c=2*a
return c
return f2()
f=f1()
print(f)#20
"""
用闭包解决问题,通过简单的问题去了解闭包的使用
如何简单地进行数的累计?
"""
a=0
def Accumulate(x):
c=a+x#没有定义a,则去全局中寻找a
return c
print(Accumulate(2))#2
print(Accumulate(3))#3
print(Accumulate(4))#4
#没有达到目的,这是错误的,进行修改如下
a=0
def Accumulate(x):
c=a+x#在赋值之前引用了局部变量a,错误,因为定义了局部变量a,它会去寻找局部定义的a
a=c#这里a就认为是局部变量了
return c
print(Accumulate(2))
print(Accumulate(3))
print(Accumulate(4))
#错误实例,再修改
a=0
def Accumulate(x):
global a#定义a为全局变量
c=a+x
a=c
return c
print(Accumulate(2))#2
print(Accumulate(3))#5
print(Accumulate(4))#9
#达到目的,进行了累加计算,但用的是非闭包的方法,再次修改使用闭包的方法
start=0
def Accumulate(x):
def Go(number):
nonlocal x#强制标注为非局部变量
new_x=x+number
x=new_x
return x
return Go
f=Accumulate(start)
print(f(2))#2
print(f(3))#5
print(f(4))#9,每次都记住了x
#达到目的,进行了累加计算,用了闭包的方法,函数式编程事例