一、命名空间

  1. 命名空间

   命名空间是一个字典,key是变量名(包括函数、模块、变量等),value是变量的值。

  2. 命名空间的种类和查找顺序

   - 局部命名空间:当前函数

   - 全局命名空间:当前模块

   - 内建命名空间:所有Python环境,所有模块

  查找顺序

     1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
     2、然后是在父函数的命名空间中搜索
     3、接着是模块命名空间中搜索
     4、最后在内置命名空间中搜索
要到内置命名空间都没找到的话,就会弹出NameError
 
  这里看一个例子
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

关于闭包:可以阅读下面两篇文章

1. 浅显理解 Python 闭包

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

带参数的装饰器

原文地址:http://www.imooc.com/code/6066

Python之命名空间、闭包、装饰器的更多相关文章

  1. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  2. Python 进阶_闭包 & 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  3. python之嵌套 闭包 装饰器 global、nonlocal关键字

    嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能  # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...

  4. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  5. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  6. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  7. 多进程,多线程,使用sqlalchemy 创建引擎(单例模式),闭包装饰器承载数据库会话,装饰模型类的类方法

    python 多进程,多线程,使用 sqlalchemy 对数据库进行操作 创建引擎 & 获取数据库会话: 使用类的方式,然后在对象方法中去创建数据库引擎(使用单例,确保只创建一个对象,方法里 ...

  8. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  9. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  10. python 3.x 的装饰器笔记

    今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...

随机推荐

  1. Ajax 初步学习总结

    Ajax是什么 Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不是一 ...

  2. OS X 10.11 中的安全删除文件

    在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. ...

  3. 《java入门第一季》之类String类小案例

    案例一: /* * 需求:把数组中的数据按照指定个格式拼接成一个字符串 * 举例: * int[] arr = {1,2,3}; * 输出结果: * "[1, 2, 3]" * 分 ...

  4. 求二叉树深度和copy二叉树

    // operatorTree.cpp // 对树的操作 #include <iostream> #include <cstdio> // 二叉树表示法 typedef str ...

  5. "《算法导论》之‘图’":深度优先搜索、宽度优先搜索(无向图、有向图)

    本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步. 下文将会用 ...

  6. windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改

    以一个redis服务为例: 一个redis注册服务后一般是网络服务账户,但是当系统不存在网络服务账户时,就会导致redis服务无法正常启动.接下来修改redis服务的登录身份. cmd下输入如下命令: ...

  7. Prefix tree

    Prefix tree The trie, or prefix tree, is a data structure for storing strings or other sequences in ...

  8. java--GUI(图形用户接口)

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9795435 day22 01-GUI(概述) GUI(图形用户界面) 1. GUI(Griph ...

  9. Android性能优化之UI渲染性能优化

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本篇博客主要记录一些工作中常用的UI渲染性能优化及调试方法,理解这些方法对于我们编写高质量代码也是有一些帮助的,主要内容包括介绍CPU,GPU的职 ...

  10. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...