python学习2019/05/03

函数式编程

闭包

函数在其他很多编程语言中是一段可执行的代码,并不是对象
如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))

使用闭包对函数变量的保存
并且,不改变全局变量

闭包是函数式编程的一种应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值