包子V3

导航

 

一。名称空间,作用域,取值顺序
1.名称空间:将变量与值的对应关系存储于内存
 
Name = ‘baozi'
 
名称空间
Name 对应的内存位置 baozi
 
解释:
1)。当程序运行时,代码从上倒下依次执行,他会将变量与值的对应关系存储在一个空间中
2)。当程序遇到函数时,将(第一层)函数名存在内存中,函数体暂时不管
3)。当函数执行时,会临时开辟空间,存放函数体内的代码(变量,代码等),函数外边访问不到这个临时空间里的内容,且当函数执行完成时,临时空间将被释放
4)。临时空间:局部名称空间
 
2.名称空间分为三种:
 1)。内置名称空间
 2)。全局名称空间
 3)。局部名称空间
 
3.作用域:
    全局作用域:内置名称空间+全局名称空间
    局部作用域:局部名称空间
 
4.加载过程:
    打开软件:内置名称空间。 
    当程序执行时:全局名称空间
    当函数调用时:局部名称空间
 
5.取值顺序(单向,不可逆,从小到大)
    先找局部 ,再找全局,最后找内置,如果都找不到就报错
 
例如:
    Name = ‘baozi’
    Def fun1():
            Name = ‘abc’
            Print(name)
 
    Fun1() #输出===> abc
 
二。函数嵌套: 多个临时空间互不影响
def func1():
    print(666)
 
def func2():
    func1()
    print(222)
 
def func3():
    func2()
    print(333)
 
print(111)
func3()
print(444)
#输出如下:
111
666
222
333
444
 
三。内置函数 :
1.globals()返回一个字典,字典的内容是全局空间内容
2. locals()返回一个字典,当前位置的所有变量
 
name = 'zfeng'
age = 1000
print(globals())
def func1():
    global name
    name = 'baozi'
    age = 477788
    global sex
    print(globals())
    print(locals())
 
func1()
#输出:
{'name': 'zfeng', 'age': 1000}
{'name': 'baozi', 'age': 1000, 'func1': <function func1 at 0x3936a4>}
{'age': 477788}
 
四。关键字 
1.global:
    作用:应用并改变全局变量
                做局部作用域中声明一个全局变量
 
未定义global 指定global 变量count ,
count = 1
def func1():
    print(count) #应用全局变量
    count += 1  #在函数内对全局变量做修改,会报错
    print(count)
func1()
count = 1
def func1():
    global count #指定global
    print(count) #应用全局变量
    count += 1  #可在函数内对全局变量做修改
    print(count)
func1()
在函数内对全局变量的修改应该先定义count  
 
 
2.nonlocal
作用:不能操作全局变量
         从哪层应用的该变量,就从哪层开始全部改变
 
未定义上层函数内变量(非全局变量),进行修改 定义非全局变量,
def func1():
    count = 1
    def func2():
        count += 1
        print(count)
    func2()
func1()
def func1():
    count = 1
    def func2():
        nonlocal count
        count += 1
        print(count)
    func2()
    print(count)
func1()
报错
2
2
五。函数名应用:
1.函数名为一个内存地址
def func1():
    print('1111')
 
print(func1)
 
#<function func1 at 0x3936a4>
 
2.函数名作为容器类的元素
l1 = [func1,func2,func3,func4]
for i in l1:
    i()
 
3.作为函数的参数
def func5():
    print('func5执行')
    return ('func5执行')
def func6(x):
    print('x=',x)
    x()
    return ('func6执行')
print(func6(func5))
 
4.作为函数的返回值
 
六。闭包
1.定义:内层函数对外层函数的非全局变量的应用,就叫闭包
2.测试方法:函数名.__closure__,返回cell 和none 
                        Cell    :闭包
                        None:非闭包
 
name = 'baozi'
def wrapper(x):
    def inner():
        print(x)
    inner()
wrapper(name)
闭包
x参数为wrapper函数的参数,inner函数应用的wrapper这上一层函数的变量
3.特点:如果python解释器遇到闭包,这个闭包不会随着函数执行结束而释放
4.用途:装饰器/爬虫
 
七。装饰器:
1.定义:装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
2.格式
 
def wrapper(func):
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)
        return ret
    return inner
 
               
3.语法糖:@
@wrapper
def func1():
    print('1111)
 
4.总结:装饰器本质是闭包,在不影响原函数的基础上,增加了一些额外的功能 
posted on 2018-05-30 08:22  包子V3  阅读(61)  评论(0)    收藏  举报