python全栈-Day 10

一、命名空间和作用域

1、内置命名空间——对应Python解释器

  • Python解释器一启动就可以使用的名字存储在内置命名空间中,比如print、len、list、tuple、dict==
  • 内置的名字在启动解释器的时候被加载进内存里

2、全局命名空间——对应 非函数的自定义代码

  • 放置了我们设置的所有变量名和函数名(所有名字)
  • 在程序从上到下被执行的过程中,一次加载进内存的

3、局部命名空间——对应 自定义函数

  • 是函数内部定义的变量名和函数名
  • 当调用函数的时候才会产生这个名称空间,随着函数执行的结束,该命名空间被回收

4、命名空间的其他内容

  • 在局部,可以使用 当前局部、全局、内置命名空间中的名字。局部命名空间根据函数个数可能有多个,其之间是隔离的,不能相互调用
  • 在全局,可以使用 全局、内置命名空间的名字,但是不能使用局部命名空间的名字
  • 在内置,不可以使用 局部、全部命名空间的名字
  • 以上符合 依赖倒置原则:上层模块应该依赖底层模块,底层模块不能依赖上层模块
  • 在正常情况下使用内置的名字,会使用内置的函数或变量;在全局定义了和内置命名空间中 同名的名字时,会使用全局的函数或变量
  • ——即,如果自己有就用自己的,如果自己没有就找底层的
    print(max([1,2,3]))
    
    def max():    #重新定义了max的函数
        print('in max func')
    
    max()    #in max func----函数内存地址(),指的是内存调用
    print(max())    #None
    print(max)  #<function max at 0x101eb48c8>----函数名的值其实是  函数的内存地址

5、作用域

  • 全局作用域:作用在全局,内置和全局名字空间中的名字都属于全部作用域
  • 局部作用域:作用在局部,函数-局部名字空间中的名字属于局部作用域
  • 对于不可变数据类型,在局部可以查看全局作用域中的变量,但是不能直接修改,如果想要修改,需要在程序的一开始添加global声明。如果在一个局部内声明了一个global变量,name这个变量在局部内的所有操作将对全局有效——不建议使用,不安全!!!使用形参、实参、返回值来修改
    a = 1
    def func():
        #a += 2    #报错
        a = 2
        print(a)    #重新定义了一个局部变量a = 2
    
    func()
    print(a)  #1,全局变量1没有改变
    
    a = 1
    def func():
        global a
        a = 2
        print(a)  #2
    
    func()
    print(a)  #2
  • 两个方法:globals、locals
    a = 1
    b = 2
    def func():
        x = 'aaa'
        y = 'bbb'
        print(locals())  #返回局部作用域中的所有名字及其值
        print(globals())  #返回全局的名字
    func()

二、三元运算符???视频丢失

def max(a,b):
    return a if a>b else b

print(max(1,2)) 

三、函数的嵌套和作用域链

1、

四、闭包

1、

猜你喜欢

转载自www.cnblogs.com/txbbkk/p/9403856.html
今日推荐