Python之命名空间、闭包、装饰器
一、命名空间
1. 命名空间
命名空间是一个字典,key是变量名(包括函数、模块、变量等),value是变量的值。
2. 命名空间的种类和查找顺序
- 局部命名空间:当前函数
- 全局命名空间:当前模块
- 内建命名空间:所有Python环境,所有模块
查找顺序
i = 1
def func():
i += 1 func() #错误:UnboundLocalError: local variable 'i' referenced before assignment
由于,func函数在创建的时候,i有赋值操作,所以就在局部命名空间生成一个i的变量但是并没有实际值,而在全局命名空间中同样也会生成i这个变量,齐值为1;
在运行的时候,由于先检索的是局部命名空间有i,所以就终止检索,但是由于没有具体值,所以返回错误。
3. 命名空间的访问
局部命名空间通过locals() 访问
全局命名空间通过globals() 访问
举个例子
'''Created on 2017-5-3''' import copy
from copy import deepcopy gstr = "global string" def func1(i, info):
x = 12345
print(locals()) func1(1 , "first") if __name__ == "__main__":
print("the current scope's global variables:")
dictionary=globals()
print(dictionary)
运行结果
{'info': 'first', 'x': 12345, 'i': 1} #局部命名空间locals()
the current scope's global variables: #全局命名空间globals()
{'func1': <function func1 at 0x0000000002BB3978>,
'gstr': 'global string',
'dictionary': {...},
'__builtins__': <module '__builtin__' (built-in)>,
'__file__': 'C:\\Users\\Administrator\\PycharmProjects\\Sample\\test.py',
'__package__': None,
'deepcopy': <function deepcopy at 0x0000000002BB3518>,
'__name__': '__main__',
'copy': <module 'copy' from 'C:\Python27\lib\copy.pyc'>,
'__doc__': 'Created on 2017-5-3'
}
4. locals与globals的一点区别
locals 是只读的,globals 不是
示例
def func1(i, info):
x = 666
print(locals())
locals()["x"]= 888
print("x=",x) y=333
func1(1 , "first")
globals()["y"]=777
print( "y=",y)
输出
{'info': 'first', 'x': 666, 'i': 1}
('x=', 666) #并没有改变
('y=', 777) #改变了值
以上知识点原文参考:Python命名空间的本质
二、闭包
什么叫闭包呢?
通俗的话将讲,就是在一个嵌套函数中,内部的函数引用了外部函数的变量,那么内部函数就是一个闭包。
def outer_func(num1):
def inner_func(num2):
return num1*num2
return inner_func func = outer_func(2)
print func(3)
运行结果为:6
inner_func() 就是一个闭包,因为他 引用了外部函数的变量num1
关于闭包:可以阅读下面两篇文章
2. Python闭包详解
三、装饰器
其实上面这个例子和装饰器,有点像,有没有?
我们把上面这个稍微改一下,变成装饰器
def outer_func(func):
def new(num2):
func(num2)
return new num1=2
@outer_func
def inner_func(num2):
print num1*num2 inner_func(3)
运行结果:6
带参数的装饰器
Python之命名空间、闭包、装饰器的更多相关文章
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- python之嵌套 闭包 装饰器 global、nonlocal关键字
嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能 # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...
- python高级-闭包-装饰器
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- guxh的python笔记三:装饰器
1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...
- 多进程,多线程,使用sqlalchemy 创建引擎(单例模式),闭包装饰器承载数据库会话,装饰模型类的类方法
python 多进程,多线程,使用 sqlalchemy 对数据库进行操作 创建引擎 & 获取数据库会话: 使用类的方式,然后在对象方法中去创建数据库引擎(使用单例,确保只创建一个对象,方法里 ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- python 3.x 的装饰器笔记
今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...
随机推荐
- NSString/NSMutable字符串——韩俊强…
1.OC基本数据类型(简单铺垫) // NSInteger 在64 位下相当于long,在非64位下相当于 int: // CGFloat 在64位下相当于double 在非64位下相当 ...
- Credit Summaries & Importing External Credit Exposure
In this Document Goal Solution APPLIES TO: Oracle Order Management - Version 11.5.10.2 to 12.1.3 ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十六)
到目前为止,选手跑到终点时仿佛没什么激动人心的事情发生呢?貌似需要添加一些胜利的特效啊! 前面说好的不添加特效,只完成游戏功能的诺言呢? T T 我们主要想实现这样一个特效效果: 1.胜利的玩家突出显 ...
- tomcat集群实现源码级别剖析
随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...
- Unity访问Access数据库
首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...
- AngularJS进阶(二十六)实现分页操作
JS实现分页操作 前言 项目开发过程中,进行查询操作时有可能会检索出大量的满足条件的查询结果.在一页中显示全部查询结果会降低用户的体验感,故需要实现分页显示效果.受前面"JS实现时间选择插件 ...
- Android Studio 1.2.2设置显示行号
Android Studio设置显示行号的方法与Eclipse有少许差别,直接在代码中右键,弹出右键菜单是没有显示行号功能的. 在Android Studio中设置方法有二: 1.临时显示行号 在单个 ...
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
. 参考界面 : 携程app首页的广告栏, 使用ViewPager实现 自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...
- Cocos2D的OALSimpleAudio预加载音频
在OALSimpleAudio接口中,没有委托机制和通知机制告诉你什么时候预加载完成.也不需要这样的机制. 如下代码: //Listing 11-1. Preloading a background ...
- OS X升级到10.11后Xcode6.4界面无iOS device选择栏的解决办法
原来在Xcode6.4项目运行按钮右侧会有一个可以选择设备或模拟器的选择栏,但是升级后没有了.但是Xcode7.0.1打开同样的项目会有显示. 简单找了一下无果后,发现咋Xcode顶部菜单里可以找到切 ...