名称空间 作用域 闭包
2017-09-24 00:55
190 查看
什么是名称空间
名称空间是存放名字的地方,对于x=1来说,1存放在内存中,x这个名字和x=1之间的绑定关系存放在名称空间中。
名称空间的加载顺序
对于test.py来说
1、Python解释器先启动,先加载内置名称空间 2、对于test.py这个文件,加载文件中的全局名称空间,如函数名,定义的变量名 3、在执行文件中的代码的时候,调用函数,临时产生局部名称空间
名字的查找顺序
局部名称空间--》全局名称空间--》内置名称空间
在全局无法查看局部的,在局部可以查看全局的
作用域
作用域就是范围
- 全局作用域:内置名称空间、全局名称空间属于这个范围,全局存活,全局有效
- 局部作用域:局部名称空间属于该范围,临时存活,局部有效
作用域在函数定义的时候就确定了,与函数的调用位置无关
查看作用域:globals(),locals()
LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> builtins
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
闭包函数
内部函数包含对外部作用域而非全局作用域的引用
def counter(): n = 0 def incr(): nonlocal n x = n n+=1 return x return incr c = counter() # c 就是函数incr print(c) print(c()) # 0 print(c()) # 1 print(c()) # 2 print(c()) # 3 print(c.__closure__[0].cell_contents) # 擦看闭包的元素
闭包的意义与作用
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,使得函数无论在何处被调用,都优先使用自己外层的作用域
应用:延迟计算
import requests def index(url): def get(): response = requests.get(url) response.encoding = 'utf-8' return response.text return get baidu = index('http://www.baidu.com') print(baidu())
装饰器
装饰器是闭包函数的一种应用场景
一 为什么用装饰器
开放封闭原则:对修改封闭,对扩展开放
二 什么是装饰器
装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
三 装饰器的使用
import time def timer(func): def wrapper(*args,**kwargs): start_time = time.time() res = func(*args,**kwargs) stop_time = time.time() print('run time is %s'%(stop_time-start_time)) return res return wrapper @timer def foo(): time.sleep(3) print('foo run') foo()
相关文章推荐
- python基础:名称空间与作用域
- 名称空间、作用域、装饰器的简单使用
- Python 的名称空间和作用域
- Python 名称空间与作用域
- 函数的名称空间与作用域
- 10. Python开发--函数名称空间与作用域
- [妖路-1] 名称空间,作用域,生存期
- 名称空间与作用域
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域(装饰器基础)
- python函数篇:名称空间、作用域和函数的嵌套
- Python 名称空间与作用域
- python 名称空间的作用域范围
- 函数的命名空间,作用域,闭包等
- C++内存模型与名称空间(存储持续性、作用域、链接性、动态内存分配、命名空间)
- 深入理解javascript原型和闭包(12)——简介【作用域】
- javascript执行上下文、作用域与闭包(第三篇)---自由变量与作用域链
- js 闭包作用
- C++primer 关于名称空间
- geoserver部分元素名称及其作用
- error CS0234: 命名空间“Microsoft.Office.Interop”中不存在类型或命名空间名称“Word”(是否缺少程序集引用?)