您的位置:首页 > 编程语言 > Python开发

Python函数的作用域、闭包、装饰器

2017-06-21 02:07 537 查看
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):
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息