Python3入门与进阶入门与进阶——““面向对象,面向对象,”闭包闭包”。(也没有很。(也没有很
难)难)
一:一切皆对象。一:一切皆对象。
Python一切都是“对象”,包括“函数”。在很多其它语言中,函数只是一段可执行代码,但Python的“函数”是可以实例化的。
因此可以做到:
a=def
也可以:把函数作为对象传递到另一个函数里作为参数,也可以把一个函数作为另一个函数的返回结果。
def curve_pre():
def curve():
pass
return curve#返回一个函数
f=curve_pre()#函数赋给一个变量
二:什么是闭包?二:什么是闭包?
首先需要知道,当需要用到一个变量值,但是在本级作用域没有定义,它就会在上一级作用域中去找。(普遍是这样)
闭包闭包=函数函数+环境变量(内嵌函数定义时候的外部变量,但又不能是全局变量)环境变量(内嵌函数定义时候的外部变量,但又不能是全局变量)
例子:
def curve_pre():
a=25
def curve(x):
return a*x*x
return curve
a=10
f=curve_pre()
print(f(2))
#f现在就是curve函数,但是它没有a的值,如果从上一级中去寻找,那应该打印40,但闭包会从“环境变量“中去找a的值。
a=25就是闭包的环境变量。
结果:
100
大致明白了”环境变量“和“闭包”的意思了。
闭包只是在表现形式上跟函数类似,但实际上不是函数。闭包只是在表现形式上跟函数类似,但实际上不是函数。
一个函数和它的环境变量合在一起,就构成了一个闭包一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在。在Python中,所谓的闭包是一个包含有环境变量取值的中,所谓的闭包是一个包含有环境变量取值的
函数函数 对象。环境变量取值被保存在函数对象的对象。环境变量取值被保存在函数对象的__closure__属性中。属性中。__closure__里包含了一个元组里包含了一个元组(tuple)。这个元组中的。这个元组中的
每个元素是每个元素是cell类型的对象。类型的对象。
def curve_pre():
a=25
def curve(x):
return a*x*x
return curve
def curve_pre():
a=30
def curve(x):
return a*x*x
return curve#因为环境变量不同,这里是两个不同的闭包:要关注整体,除了看函数还要看环境变量。
以下是以下是“闭包闭包”的经典误区:的经典误区:
def f1():
a=10
def f2():