8月30日学习内容整理:命名空间,作用域,函数名本质,闭包
补充:
三元运算:c= a if a>b else b
相当于: if a>b:
c=a
else:
c=b
结构; if条件成立的结果 if 条件 else if条件不成立的结果
一、命名空间
(1)(按加载顺序)
1、内置命名空间:存放python内部可以直接用的功能,例如:input print while等,是代码运行前就创建的
2、全局命名空间:存放代码的变量和函数名,是在代码运行开始时创建的,从上到下依次加载(除函数里面的名字)
3、局部命名空间:存放函数调用时函数内部的名字,从上到下加载
(2)对变量的使用
1、局部可以用全局的变量,全局不可以用局部的变量
2、对局部来说:a) 自己有的用自己的,自己没有的用全局的
b) 有嵌套时,自己有用自己的,自己没有的往上一级一级找,直至找到为止
二、作用域
(1)内置空间:在任意地方都可以用
(2)全局空间:在写的代码里的任意地方都可以用
(3)局部空间:在自己定义的函数里使用
范围:内置>全局>局部>局部里的局部(嵌套)
(4)作用域链的概念:
(5)global和local的用法
globals代表全局作用域,放在哪都一样,显示所有的变量
locals代表局部作用域,放在函数里只会显示当前函数的变量
(6)修改全局变量值和局部变量值:一般不常用,尤其是全局变量,不要轻易修改
global 修改全局命名空间里的变量值,也是声明全局变量
nonlocal 只修改局部命名空间里的 从内部往外部找到第一个对应的变量名
globals() locals() a = 0 def demo1(): global a a = 2 print(a) demo1() print(a)
def whl1(): a=2 def whl2(): nonlocal a a=3 print(a) whl2() print(a) whl1() print(a)
三、函数名的本质
1、函数名本质就是个变量名,当变量用就行
(1)函数名就代表函数的内存地址,把这个内存地址取出来,就可以调用
(2)函数名可以赋值给新变量
(3)函数名可以当元素(列表、元组等容器类型)
(4)函数名可以做函数的参数
(5)函数名可以当做函数的返回值,返回值就是函数的内存地址
2、函数名是第一类对象,这个概念要知道
3、当函数名被赋予变量,元素时,都可以在新变量或者取索引后加括号来调用该函数
def whl(): a=123 print(a) print(whl) val=whl val() li=[whl] li[0]()
四、闭包
1、概念:内部函数引用了外部函数的变量而非全局变量。这个内部函数就叫闭包
闭包名._ _closure_ _ 会输出闭包使用的所有外部变量(元组类型),可以当作判断是否为闭包的依据,如果没有输出则不是闭包。