闭包
enclosing:函数内部与内嵌函数之间的变量
闭包(Closure):内部函数对enclosing作用域的变量进行引用,延长其使用寿命
下面以成绩判断方式为例:
一、普通的函数判断
#cloding:utf-8
def cmp(val, passline):
if val >= passline:
print('pass')
else:
print('failed')
cmp(59, 60)#函数执行完成passline变量也就被回收
cmp(90, 60)
运行结果:
failed
pass
这种方式在调用的过程中需要在使用时不断输入判断基础值,并且方式比较局限
二、闭包实例一
直接返回比较的函数对象
#coding:utf-8
def set_passline(passline):
def cmp(val):
if val >= passline:
print("pass")
else:
print("failed")
return cmp
f = set_passline(60)#返回函数对象cmp,这步完成后其中passline变量没有被释放
f(90)
f(50)
f(30)
运行结果为:
pass
failed
failed
三、闭包实例二
将比较函数对象当作参数,提高代码的可重复使用性
#cloding:utf-8
def set_passline(passline):
def cmp(val):
if val >= passline:
print("pass")
else:
print("failed")
return cmp
def judge(func):
def in_judge(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val, int):
return 0
return func(*arg)
return in_judge
fcmp_100 = set_passline(60)
fcmp_150 = set_passline(90)
fcmp_100 = judge(fcmp_100)
fcmp_150 = judge(fcmp_150)
fcmp_100(80)
fcmp_100(50)
fcmp_150(100)
fcmp_150(60)
运行结果:
pass
failed
pass
failed
类似与c/c++中的回调函数