#python闭包
- 封装
- 提高代码复用
- 内层函数引用外层函数的变量,返回内层函数
- 返回函数不可以为循环变量
示例1:
#标准线不同时,判断学生的成绩是否通过
方法1:
def pass_60(val) : #标准线为60时,判断是否通过
passline = 60
if val > passline :
print("pass")
else :
print("No pass")
def pass_90(val) : #标准线为90时,判断是否通过
passline = 90
if val > passline :
print("pass")
else :
print("No pass")
方法2:闭包实现
def pass_line(passline) :
def cmp(val) :
if val > passline :
print("Pass")
else :
print("No pass")
return cmp
#调用函数
f_60 = passline(60)
f_60(100) ------>print("pass")
f_60(29) ------->print("No pass")
#将函数作为参数传递闭包
#方法1
def my_sum (*args) :
if len(args) == 0 : return 0
for val in args :
if not isinstance(val, int):
return 0
return sum(args)
def my_ave(*args) :
if len(args) == 0 : return 0
for val in args :
if not isinstance(val, int):
return 0
return sum(args)/len(sum)
#方法2 :通过闭包实现
def my_sum (*args) :
return sum(args)
def my_ave(*args) :
return sum(args)/len(sum)
def dec(Func) :
def in_dec(*args) :
if len(args) == 0: return 0
for val in args:
if not isinstance(val, int):
return 0
return Func(*args)
return in_dec
my_sum = dec(my_sum(1,2,3,4,5)
#python中的匿名函数
- 关键字lambda表示匿名函数
- 函数形式:lambda args : 表达式
- 匿名函数只能有一个表达式,
return,返回值为表达式的结果 - 匿名函数不需要定义函数名,直接创建函数对象,简化代码
示例1:
#返回x的值
val = lambda x : x if x > 0 else -x
print(val(1))
示例2:
#返回列表中的元素的平方列表
val = map(lambda x :x*x,[1,2,3,4,5,6])
print(list(val))
#等价于
def Func(x) :
return x*x
val =map(Func,[1,2,3,4,5,6])
print(list(val))
示例3:
#源代码
def Function(s) :
return s and len(s.strip()) > 0
val = filter(Function,["Herry","","Gerry"])
print(list(val))
#代码简化
val = filter(lambda s:s and len(s.strip())> 0,["Herry","","Gerry"])
print(list(val))
#decorator装饰器
- 实质:闭包的使用
def dec(Func) :
def in_dec(*args) :
if len(args) == 0: return 0
for val in args:
if not isinstance(val, int):
return 0
return Func(*args)
return in_dec
@dec #对闭包的使用
def my_sum (*args) :
return sum(args)
def my_ave(*args) :
return sum(args)/len(sum)