2)locals和golbals 、nonlocal和global
locals 获取当前作用域中的所有内容,有两种情况(返回系统的字典)
在函数外 ,获取打印之前的所有变量,返回字典,全局空间
在函数内 ,获取调用之前的所有变量,返回字典,局部空间作用域
# 例子 1
a = 1
b = 2
res = locals()
c=3
print(res)
d = 4
# 例子2
a=1
def func():
b = 2
res = locals()
c=3
print(res)
d = 4
func()
golbals 获取全局作用域的所有内容(返回系统的字典)
在函数外,获取打印之前的所有变量,全局空间作用域
在函数内,获取调用之前的所有变量,全局空间作用域
# 例子3
a = 5
b = 6
res = globals()
c = 7
print(res)
# 例子4
a =10
def func():
b = 11
c = 12
res = globals()
d= 13
print(res)
ff = 30
func()
zz = 50
注:在函数调用之前的才会获取
nonlocal:nonlocal 专门用来修改当前作用域上一级的局部变量,如果找不到,那么继续向上寻找,全都找不到直接报错。注:只能修改局部变量,不能修改全局变量,遵循LEGB原则
不使用nonlocal修改局部变量-------》》把数据放到列表中可以进行修改
# 1
def outer():
a = 10
def inner():
nonlocal a
a = 20
inner()
print(a)
outer()
# 2
def outer():
lst = [1,2,42]
def inner():
lst[-1] = 52
inner()
print(lst)
outer()
global:修改全局变量
globals创建变量:通过系统的全局字典添加键值对,可以动态创建全局变量
变量的两种定义方式:
# 正常方式定义变量
a = "123"
# 通过系统的全局字典添加键值对,可以动态创建全局变量
dic = globals()
print(dic)
k = "wang"
dic[k] = "asf"
print(wang)
# 3.批量创建全局变量,在函数中
def func():
dic = globals()
for i in range(1,6):
dic["p%d" % (i)] = i
func()
print(p1)
print(p2)
print(p3)
print(p4)
print(p5)
7、函数的嵌套
嵌套在函数的外边叫外函数;嵌套在函数的里面叫内函数
(1)内部函数不可以直接在函数外部调用
(2)调用外部函数后,内部函数也不能在函数外部调用
(3)内部函数可以在函数内部调用
(4)内部函数在函数内部调用时,有先后顺序(注:要先定义函数再调用)
LEGB原则(即就近找变量的原则)寻找变量遵循的原则是从里到外,从下向上就进找
B – Builtin(Python):Python内置模块的命名空间 (内建作用域)
G – Global(module):函数外部所在的命名空间 (全局作用域)
E – Enclosing function locals:外部嵌套函数的作用域(嵌套作用域)
L – Local(function):当前函数内的作用域(局部作用域)
def outer():
def inner():
def smaller():
print(id)
print("我是smaller函数")
smaller()
inner()
outer()
8、闭包函数
内部函数定义:
内函数使用了外函数的局部变量
外函数将内函数返回出来的过程,叫做闭包
里面的内函数叫做闭包函数
判断闭包的两种方式:
(1)通过直接获取注释内容
(2)通过两个方法,获取单元格对象里面的内容:cell_contents、__closure__
闭包函数的特点:内函数使用了外函数的局部变量,该局部变量与内函数发生绑定,延长该变量的生命周期
闭包的意义:
闭包可以优先使用外函数的局部变量
局部变量在函数外部不能被直接使用
对局部变量实现了保护的作用,外部无法访问
# 闭包函数用法
def wz_family():
father = "王健林"
def wzj_hobby():
print("先定一个小目标,比如赚他一个亿,这是爸爸{}说的".format(father))
return wzj_hobby
# res = wzj_hobby <=> res() = wzj_hobby()
res = wz_family()
print(res)
res()
# 获取闭包函数使用的变量 __closure__ , cell_contents
tup = res.__closure__
print(tup)
9、匿名函数
lambad 表达式:只有返回值的函数,特点:简洁,高效,方便
(1)无参的lambda表达式
def func():
return “我是个诗人”
func = lambda : “我是个诗人”
res = func()
print(res)
(2)有参的lambda表达式
def func(n):
return type(n)
func = lambda n : type(n)
res = func(18)
print(res)
(3)带有判断条件的lambda表达式
def func(n):
if n % 2 == 0:
return “偶数”
else:
return “奇数”
三目(元)运算符:
真值 if 条件表达式 else 假值
表达式成立就返回真值,表达式不成立就返回假值
# 三目运算符
n = 20
res = "偶数" if n % 2 == 0 else "奇数"
print(res)
# 改写lambda
func = lambda n : "偶数" if n % 2 == 0 else "奇数"
res = func(21)
print(res)