# ##### locals 和 globals#locals 获取当前作用域中的所有内容(函数外,获取的是打印之前的所有内容,返回一个字典,全局空间作用域)(函数内,获取的是调用之前的所有内容,返回一个字典,局部空间作用域)(1)
a =1
b =2
res =locals()
c =3print(res)(2)
a =1deffunc():
b =2
res =locals()
c =3print(res)
func()#### globals 获取全局作用域的所有内容(函数外(打印之前)和函数内(调用之前),获取的是打印之前的所有内容,返回一个字典,全局空间作用域)(3)
a =5
b =6
res =globals()
c =7print(res)(4)
a =1deffunc():
b =2
res =globals()
c =3print(res)
func()##### globals 返回一个系统字典
那么就可以把字符串变成一个变量
通过系统的全局字典添加键值对,可以动态创建全局变量
<--------------------------------------------------------------------------># #### 函数的嵌套
嵌套在函数外边叫做外函数
嵌套在函数内部叫做内涵数
deffunc():definner():print("我是inner函数")1.内部函数可以直接在函数外部调用吗? 答案是不可以
2.调用外部函数后,内部函数可以在函数外部调用吗 不可以的
3.内部函数可以在函数内部调用吗 可以的
4.内部函数在函数内部调用时,是否有先后顺序 有的,必须先定义再调用
deffunc():definner():defsmaller()print("王振牛皮")
smaller()
inner()
func()# LEGB原则 (就近找变量的原则)
寻找变量的调用原则采用LEGB原则,就近原则
B -- python内置模块的命名空间 局部
G -- 函数外部所在的命名空间 全局
E -- 外部嵌套函数的作用域 局部
L -- 当前函数内的作用域 局部
找变量顺序:从里向外,从下向上,就近找变量的原则 LEGB原则
<------------------------------------------------------------------------># #### global 和 globals# #### nonlocal 关键字,用来修改局部变量nonlocal 遵循LEGB原则
(1) 专门用来修改当前作用域上一级的局部变量
(2) 如果上一级找不到,那么继续向上找
(3) 全都找不到,直接报错
defouter():
a =10definner():nonlocal a
a =20#print(a)
inner()print(a)
outer()
结果是20(4)不适用nonlocal 是否可以修改局部变量呢? 可以的
把要修改的值放入列表中,利用列表的索引下标进行修改
<--------------------------------------------------------------->### #### 闭包函数"""
闭包函数:
内函数使用了外函数的局部变量
外函数将内函数返回出来的过程就叫做闭包
里面的内函数叫做闭包函数
"""1.闭包函数用法
defwz_family():
father ="王健林"defhobby():print("先定一个小目标,赚它一个亿,{}说的".format(father))return hobby
res = wz_family()print(res)
res()2.大闭包包含小闭包,返回后,内部函数也是闭包函数
##### 获取闭包函数使用的变量___closure__(返回闭包函数的内容) cell_contents(取出对象)<----------------------------------------------------------------------------->#### 闭包的特征"""
内函数使用了外函数的局部变量,该局部变量会和内函数发生绑定,来延长该变量的生命周期
"""# 闭包的意义1.延长局部变量的生命周期
1.保护变量的安全性,外部无法访问
##### 匿名函数(lambda 表达式)"""
用一句话来表达只有返回值的函数
语法结构:
lambda 参数 : 返回值
"""(1)无参数的lambda表达式
lambda:"我是个诗人"(2)有参数的lambda表达式
lambda n :type(n)(3)带有判断条件的lambda表达式
lambda n :"偶数"if n %2==0else"奇数"###三元运算符
真值 if 条件表达式 else 假值
如若表达式成立,返回前面的真值
如果表达式不成立,返回假值
lambda a,b : a if a > b else b