Python函数的作用域
LEGB: L>E>G>B 查找顺序优先级L:local函数内部作用域,是最底层的单个函数里面;
E:enclosing函数内部与内嵌函数之间,是有内部函数的函数里面;
G:global 全局作用域,是一个.py文件中;
B:build-in内置作用域,比如:tuple,list,元组。是所有.py文件中。
Python函数的闭包
#定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
分解来说,包含下面3个条件:
1) 需要函数嵌套, 就是一个函数里面再写一个函数.
2) 外部函数需要返回一个内部函数的引
3) 外部函数中有一些局部变量, 并且, 这些局部变量在内部函数中有使用
一些概念:
1)自由变量: 外部函数中定义的局部变量, 并且在内部函数中被使用
2) 闭包: 那个使用了自由变量并被返回的内部函数就称为闭包
#支持闭包的语言有这样的特性:
1)函数是一阶值(First-class value),即函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值
2)函数可以嵌套定义,即在一个函数内部可以定义另一个函数
#代码示例(点开编辑查看)
#coding:utf-8
#闭包的好处:1实现封装,2实现代码复用
def func(val):
def func2(score): #闭包func2 if score >= val: print('及格') else: print('不及格') return func2 f_100 = func(60) # 60及格100满分 f_150 = func(90) # 90及格150满分 f_100(89) f_150(89) 闭包会保留来自外围作用域变量的信息。 Python 中函数对象都拥有一个 __closure__ 属性。 __closure__ 对象返回一个由 cell 对象组成的元组,cell 对象记录了定义在外围作用域的变量信息。 对于那些不是闭包的函数对象来说,__closure__ 属性值为 None。def get_sum(val):return sum(val)def get_div(val):
return float(sum(val)) / float(len(val))def dec(func):
def in_dec(*arge):
# print('in_dec') if len(arge) == 0:
return 0 for val in arge:
if not isinstance(val, int):
return 0 return func(arge) return in_decf_get_sum = dec(get_sum) # f_get_sum=in_dec -->in_dec(*arge) -->func(arge)f_get_div = dec(get_div)
print(f_get_sum(1, 2, 3, 4, 5))
print(f_get_div(1, 3, 5, 7, 9))
print(f_get_sum(1, 3, 5, 7, 9, '6'))
print(f_get_div(1, 3, 5, 7, 9, '6'))
Python函数的装饰器装饰器就是对闭包的使用1 装饰器用来装饰函数2 返回一个函数对象 3 被装饰函数标识符指定返回的函数对象 4 语法糖 @deco def in_dec(*arge): # print('in_dec') if len(arge) == 0: return 0 for val in arge: if not isinstance(val, int): return 0 return func(arge) return in_dec @dec #@dec相当于:get_sum=dec(func)->dec(func)返回in_dec则get_sum=in_dec def get_sum(val): return sum(val) @dec def get_div(val): return float(sum(val)) / float(len(val)) print(get_sum(1,3,5,7,9)) print(get_div(1,3,5,7,9))def dec(func):