# ##### locals 和 globals
#locals 获取当前作用域中的所有内容
(函数外,获取的是打印之前的所有内容,返回一个字典,全局空间作用域)
(函数内,获取的是调用之前的所有内容,返回一个字典,局部空间作用域)
(1)
a = 1
b = 2
res = locals()
c = 3
print(res)
(2)
a = 1
def func():
b = 2
res = locals()
c = 3
print(res)
func()
#### globals 获取全局作用域的所有内容
(函数外(打印之前)和函数内(调用之前),获取的是打印之前的所有内容,返回一个字典,全局空间作用域)
(3)
a = 5
b = 6
res = globals()
c = 7
print(res)
(4)
a = 1
def func():
b = 2
res = globals()
c = 3
print(res)
func()
##### globals 返回一个系统字典
那么就可以把字符串变成一个变量
通过系统的全局字典添加键值对,可以动态创建全局变量
<-------------------------------------------------------------------------->
# #### 函数的嵌套
嵌套在函数外边叫做外函数
嵌套在函数内部叫做内涵数
def func():
def inner():
print("我是inner函数")
1.内部函数可以直接在函数外部调用吗? 答案是不可以
2.调用外部函数后,内部函数可以在函数外部调用吗 不可以的
3.内部函数可以在函数内部调用吗 可以的
4.内部函数在函数内部调用时,是否有先后顺序 有的,必须先定义再调用
def func():
def inner():
def smaller()
print("王振牛皮")
smaller()
inner()
func()
# LEGB原则 (就近找变量的原则)
寻找变量的调用原则采用LEGB原则,就近原则
B -- python内置模块的命名空间 局部
G -- 函数外部所在的命名空间 全局
E -- 外部嵌套函数的作用域 局部
L -- 当前函数内的作用域 局部
找变量顺序:从里向外,从下向上,就近找变量的原则 LEGB原则
<------------------------------------------------------------------------>
# #### global 和 globals
# #### nonlocal 关键字,用来修改局部变量
nonlocal 遵循LEGB原则
(1) 专门用来修改当前作用域上一级的局部变量
(2) 如果上一级找不到,那么继续向上找
(3) 全都找不到,直接报错
def outer():
a = 10
def inner():
nonlocal a
a = 20
#print(a)
inner()
print(a)
outer()
结果是20
(4)不适用nonlocal 是否可以修改局部变量呢? 可以的
把要修改的值放入列表中,利用列表的索引下标进行修改
<--------------------------------------------------------------->
### #### 闭包函数
"""
闭包函数:
内函数使用了外函数的局部变量
外函数将内函数返回出来的过程就叫做闭包
里面的内函数叫做闭包函数
"""
1.闭包函数用法
def wz_family():
father = "王健林"
def hobby():
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 == 0 else "奇数"
###三元运算符
真值 if 条件表达式 else 假值
如若表达式成立,返回前面的真值
如果表达式不成立,返回假值
lambda a,b : a if a > b else b
王振2020-5-13笔记
最新推荐文章于 2020-05-29 20:43:41 发布