一 命名空间
命名空间也叫做名称空间
什么内置名称空间:人家直接写好的,我们直接就可以调用的,就叫做内置名称空间
什么是全局变量:除了函数内部定义的内容外,自己写的代码就叫做全局变量
什么是局部变量:在函数内部定义的内容,就叫做局部名称空间
a=1 #全局变量 def func(): a=2 #局部变量 def func1(): a=3 #局部里的局部变量 print(a) func1() print(a) #print:就属于内置的名称空间 func() print(a)
在全局是不可以直接调用局部的变量,局部变量只能在低于该层和该层的函数去调用,而在局部是可以调用全局的变量的。
a=1 #全局变量 def func(): def func1(): print(a) func1() print(a) func() print(a)
在全局内部可以同时创建多个同等级的局部命名空间,而这些命名空间之间是没有关系的。
a=1 def wahaha(): a=2 print(a) def shuangwaiwai(): print(a) wahaha() shuangwaiwai()
对于局部来说,需要调用一个内容时,首先是要在该层寻找,该层有就用该层的,没有就会向全局的方向一层一层的寻找,直到找到了为止。
加载顺序:启动python——>内置命名空间——>全局命名空间(从上到下加载顺序)——>局部命名空间(调用的时候才开始加载)
内置命名空间是在任意地方都可以调用;全局命名空间只能是在自己写的代码里使用;局部只能在当前函数里调用。
global:就是在局部里面修改全局的变量值
# a=0 # def aa(): # a=1 # def bb(): # global a #global:在局部变量修改全局变量的值 # a=2 # print(a) # bb() # print(a) # aa() # print(a)
nonlocal:只修改局部的变量值,从该层的上一层一层一层的查找,找到第一个并修改。
# a=0 # def aa(): # a=1 # def bb(): # nonlocal a #nonlocal:修改上一级的局部变量的值 # a=2 # print(a) # bb() # print(a) # aa() # print(a) # a=0 # def aa(): # a = 2 # def cc(): # def bb(): # nonlocal a #总结:只修改局部的变量值,从该层向外层找到第一个并修改 # a=1 # print(a) # bb() # print(a) # cc() # print(a) # aa() # print(a)
先有了作用域,才有了名称空间
什么是全局作用域链:从调用的那层向外层一层一层的查找需要调用的内容,直到找到第一个,就会停止查找。
二 函数名
直接用print打印函数名,不加上括号,结果打印出来会是这个函数的内存地址和函数名。
函数名就是一个内存地址,相当于就是一个变量。
def wahaha(): print(123) print(wahaha)
函数名可以赋值,也可以作为其他容器的元素。
# def func(): # print('alex_aa') # print(func) # a=func # print(a) # a() # l=[func] # print(l) # l[0]() # def alex(): # print('ab') # def func(aa): # print(aa) # aa() # func(alex)
函数名还可以作为函数的返回值或者参数。
# def wahaha(): # name='alex' # def shuangwaiwai(): # print(name) # return shuangwaiwai # yousanru=wahaha() # yousanru()
三, 三元表达式
三元表达式就是将一些简单的执行语句用更简单的代码写出来
比如:执行结构=判断语句成立的执行语句 if 判断语句 else 判断语句不成立的执行语句
a=10 b=9 c=a if a>b else b print(c)
四 闭包函数
闭包函数一定要用到嵌套函数
什么是闭包函数:内部函数引用了外部函数的变量,这个内部函数就叫做闭包函数,闭包就是一种函数
def wahaha(): name='fang' def shuangwaiwai(): #这个函数就是闭包函数 print(name) shuangwaiwai() wahaha()
闭包函数的作用:装饰器是闭包函数的其中的一种应用。
在变量不会改变的情况下还可以不用重复的创建。
闭包函数的特点:1 自带作用域;2延迟计算
闭包函数的基本形式:def 外部函数名():
内部函数需要的变量
def 内部函数():
引用外部变量
return 内部函数
使用闭包函数需要注意的是:因为闭包的概念就是有内部的函数而来的,所以不能在外部函数以外的地方对内部函数进行调用。
python3以前并没有直接的解决方案,只能间接性通过容器来进行存放因为容器类型没有放在栈内,所以你会屏蔽掉。字符串,列表,元组等等都可以往里面存放的就是容器类型。
在闭包中,外部函数的局部变量对应内部函数的局部变量,意思就是全局变了和局部变量的对应关系,在内部函数中,只能对外部函数进行调用,而不能进行修改。
如果希望在内部函数里修改外部函数的局部变量的值,也是会有方法的,那就是nonlocal,使用方法和global一样。