day4----函数-闭包-装饰器

本文档内容:

1 python中三种名称空间和作用域

2 函数的使用

3 闭包

4 装饰器

一 python中三种名称空间和作用域

1.1名称空间:

当程序运行时,代码从上至下依次执行,它会将变量与值得关系存储在一个空间中,这个空间
也叫命名空间。例如:name='xingchen'
当程序遇到函数时,它会将函数名存在内存中,函数内部的变量和逻辑暂时不关心;
当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码(变量,代码等),这个空间叫临时名称空间
也叫局部名称空间。
函数外面访问不到临时空间的内容;随着函数的执行完毕,临时空间会释放掉。

python中名称空间分三种:
  内置名称空间
  全局名称空间
  局部名称空间
作用域:
  全局作用域:
    内置名称空间
    全局名称空间
局部作用域:
    局部名称空间
加载顺序
内置名称空间 ---》全局名称空间(程序执行时) ---》局部名称空间(函数执行时)
取值顺序:单向不可逆
局部名称空间 ---》全局名称空间 ----》内置名称空间

1.2  globals和locals

print(globals() ) 返回的是全局作用域里面的变量与其值,是一个字典

扫描二维码关注公众号,回复: 1124161 查看本文章

print(locals())   返回的是当前的局部变量与其值,也是一个字典

例如:

def func1():
a=1
print(a)
print(locals())
print(globals())
func1()

其结果为:

1

{'a': 1}

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000024FD014B240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/PycharmProjects-x/s22day03/day4/lianxi.py', '__cached__': None, 'time': <module 'time' (built-in)>, 'func1': <function func1 at 0x0000024FD0056048>}

1.3 global和nonlocal

global:声明一个全局变量,可以用作局部变量的关键字来修改或赋值给全局变量,

    但是:对可变数据类型(list,dict,set)可以直接引用不用通过global。

nonlocal:在局部作用域中,对其父级作用域(或者更外层作用域)进行变量赋值或者修改,但是不能修改全局作用域

例如:

def func1():
a=1
def func2():
b=10
def func3():
nonlocal a,b
a=a+1
b=b+1
print(a,b) #结果为 2,11
func3()
print(a,b) #结果为 2,11,func2函数的b被引用了
func2()
print(a)        #结果为 2,这里的变量a被引用了,但是b不是在这里面引用的,所以打印b会报错
func1()

二函数的使用

函数名的本质就是函数的内存地址

1 函数可以被引用

例如:

def func1():
print('in func1')
f=func1
print(f)
结果为:<function func1 at 0x000001E9313C6048>

2 函数可以作为容器类元素

例如

def func1():
print('f1')

def func2():
print('f2')

l1=[func1,func2]
l2={'f1':func1,'f2':func2}

l1[0]()
l2['f2']()

3 函数可以作为返回值

def f1():
    print('f1')

def func1(argv):
    argv()
    return argv

f = func1(f1)
f()

其他: 第一类对象

第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。

 三 闭包

内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数,一般用于装饰器或者网络爬取内容

判断闭包函数的方法__closure__

例如:

def func():
    name = 'eva'
    def inner():
        print(name)
     print(inner.__closure__) #结果中函数cell元素,否则为none
return inner
f = func()
f()

四 装饰器



猜你喜欢

转载自www.cnblogs.com/mmyy-blog/p/9109425.html