L: local 函数内部作用域
E: enclosing 函数内部与内嵌函数之间
G: global 全局作用域
B: build_in 内置作用域
python函数的闭包,python的闭包函数,内部的函数会将外部函数的参数变成内部函数的一个属性,以元组的形式储存下来。
方式1:
描述:我们想要写一个判断学生成绩的代码,当科目满分为150,那么及格线为90分,如果科目满分为100,那么及格线为60分。
要求:实现查询学生是否通过考试
def set_passline(passline):
def judge(score):
if score>=passline:
print('good')
else:
print('bad')
return judge
当我们第一次调用时候传进去一个参数:
set_one =set_passline(150)
set_passline函数执行完会返回judge函数,并且把外层函数传进来的passline作为自己的属性用一个不可变的元组保存(passline,)
set_one(80)
然后调用函数set_one,并传入学生成绩,就能进行判断,set_one函数里的passline,就是在运行的时候保存下来的。
f= set_passline(150)(80)
这种调用方式也是可以的。
方式2:
描述:有两个函数把他们用闭包的方是合起来:
#求和
def add(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return sum(arg)
#求平均值
def val(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return sum(arg)/len(arg)
处理后
#求和
def add(*arg):
return sum(arg)
#求平均值
def val(*arg):
return sum(arg)/len(arg)
def dec(func):
def in_dec(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
func(*arg)
return in_dec
分析:
首先我们调用dec,并且把想要运行的函数传递进去
add =dec(add)
在这一步,程序完成了执行dec(add),把func=add,存了下来,并且把函数in_dec返回给了add.此时的add就是in_dec(*arg),携带了一个属性:(func = add),func指向了之前的add的函数。
add(1,2,3,4,5)
这一步实际上执行的是in_dec(1,2,3,4,5)这个函数把*arg接收后,传给了内部函数func ,并且执行了func(*arg)。也就是执行了之前的那个add函数。
原文链接:https://blog.csdn.net/javali1995/article/details/78221976