三种名称空间

  1. 内置名称空间:随着python解释器的启动而产生

  2. 全局名称空间:文件级别定义的名字会放入该空间

  3. 局部名称空间:调用函数时会产生局部名称空间,只在函数调用时临时有效

作用域

  1. 全局作用域:内置名称空间,全局名称空间

  2. 局部作用域:局部名称空间

名字查找顺序

  • 局部名称空间--->全局名称空间--->内置名称空间

  • 查看全局作用域内的名字:gloabls()

  • 查看局部作用域内的名字:locals()


x=1000def func(y):
    x=2
    print(locals())
    print(globals())
func(1)
locals --> {x:2,y:1}
globals --> x=1000,func
  • 全局作用域:全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件执行完毕

  • 局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效

闭包函数

  1. 定义在内部函数

  2. 包含对外部作用域而非全局作用域的引用,该内部函数就称为闭包函数

  • 简单闭包函数

def f1():
        x = 1
        def f2():
            print(x)        return f2
    f=f1()#f1函数返回值为f2,f=f2
x=1# y=2def f1():
    # x=1
    y=2
    def f2():
        print(x,y)    return f2

f=f1()
print(f.__closure__[0].cell_contents)
__closure__判断是否为闭包函数
cell_contents为闭包函数打印内容

装饰器

  • 装饰器:修饰的工具,添加功能,工具值得是函数

  • 装饰器本身可以是任何可调用的对象,被装饰器对象也可以是任意可调用对象

  • 为何使用装饰器

  1. 开放封闭原则:对修改是封闭的,对扩展是开放的

  2. 装饰器就是为了在不修改被装饰对象的源代码以及调用方式的前提下,为其添加新功能

#流程分析无参数装饰器# import time# def timmer(func):#     def wrapper():#         start_time=time.time()#         func()#         stop_time=time.time()#         print('run time is %s' %(stop_time-start_time))#     return wrapper## @timmer #index=timmer(index)# def index():#     time.sleep(3)#     print('welcome to index')### index() #wrapper()
  • 有参数装饰器

# import time# def timmer(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## @timmer #index=timmer(index)# def index():#     time.sleep(3)#     print('welcome to index')#     return 1## @timmer# def foo(name):#     time.sleep(1)#     print('from foo')### res=index() #wrapper()# print(res)