1.locals() 和 global() 函数
在函数外部进行调用locals()和globals()函数时:
获取的是打印之前的所有变量,返回字典,全局作用域
在函数内部进行调用locals()和globals()函数时:
对于locals()获取的调用前当前作用域的所有变量,返回字典,局部作用域
对于globals()获取的调用前的所有变量,全局作用域
#locals() 获取当前作用域的所有变量
#在函数外
a=6
c=5
res=locals()
d=99
print(res) #获取的是打印前的所有变量,即包括d=99
#在函数内
def func():
cc=122
res=locals()
dd=999
print(res)#获取的是调用前当前作用域的所有变量,即只有cc=122
func()
#globals() 获取全局所有域的全部变量
#在函数外
rr=100
res=globals()
ggg=555
print(res)#在函数外,获取的是打印之前的所有变量,即包括ggg=555
#在函数内
def func():
bbb=6666
res=globals()
jjjj=2222
print(res)#在函数内,获取的是调用前的所有变量,即不包含jjjj=2222
func()
#1.通过系统的全局变量字典添加键值对,可以动态创建全局变量
dic=globals()
k='chenbo'
dic[k]='帅哥'
print(dic)
print(chenbo)
#2.在函数中,批量创建全局变量
def func():
dic=globals()
for i in range(0,7):
dic['p%d'%(i)]=i
func()
print(p1)
print(p2)
print(p3)
print(p4)
2.函数的嵌套
函数的嵌套:
嵌套在函数外部叫做外函数
嵌套在函数的里面叫做内函数
特点:
内部函数不可以在函数外部调用
调用外部函数后,内部函数也不可以在函数外部调用
内部函数可以在函数内部调用
#内部函数不可以在函数外部调用
#调用外部函数后,内部函数也不可以在函数外部调用
def func():
def func1():
print('dadas')
func()
#func1()报错
#内部函数可以在函数内部调用(但要注意先运行定义再调用)
def func():
#func1() 报错
def func1():
print('dadas')
func1()
func()
#内部函数在函数内部调用时,有先后顺序
def outer():
def inner():
def smaller():
print('哈哈哈哈')
smaller()
inner()
outer()
# LEGB原则(就近找变量的原则)
#找寻变量的调用顺序采用LEGC原则(就近原则)
def outer():
def inner():
def smaller():
print(id)
smaller()
inner()
outer()
3.nonlocal 用于修改局部变量
nonlocal遵循LEGB原则
nonlocal专门用于修改上一级作用域的局部变量
如果上一级找不到则继续往上
一直找不到则报错
#使用nonlocal修改上一级作用域局部变量
def outer():
a=100
def inner():
nonlocal a
a=200
print(a)#a=200修改成功
print(a)#未修改前a=100
inner()
print(a)#修改后a=200
outer()
print('<================>')
#若上一级找不到修改的局部变量,则继续往上寻找
def outer():
a=100
def inner():
#找不打往外一层寻找
def smaller():
nonlocal a
a=200
print(a)#a=200修改成功
print(a) # 未修改前a=100
smaller()
inner()
print(a)#修改后a=200
outer()
#一直找不到则报错
def outer():
a=100 #删除a=100则报错
def inner():
#找不打往外一层寻找
def smaller():
nonlocal a
a=200
print(a)#a=200修改成功
print(a) # 未修改前a=100
smaller()
inner()
print(a)#修改后a=200
outer()
#不使用nonlocal,使用列表进行修改局部变量
def func():
lst=[1,2,3,44]
def inner():
lst[-1]=0
inner()
print(lst)
func()
4.闭包函数
闭包函数的定义:
内函数使用了外函数的局部变量
外函数将内函数返回的过程叫做闭包
里面的函数叫做闭包函数
#闭包的用法
def wz_family():
father='王健林'
def wjl_hobby():
print('先定个小目标,比如挣个一个亿,这是{}说的'.format(father))
return wjl_hobby
#res=wjl_hobby <==>res()=wjl_hobby()
res=wz_family()
print(res)
res()
#升级 大闭包里包含小闭包
def func():
father='马云'
jiejie='马蓉'
meimei='马诺'
money=1000
def jiejie_hobby():
nonlocal money
money-=700
print('爱包包....花完了,还剩下%d元'%(money))
def meimei_hobby():
nonlocal money
money-=200
print('宝马.自行车,还剩下%s元'%(money))
def big_master():
return [jiejie_hobby,meimei_hobby]
return big_master
res=func()
print(res)
lst=res()
lst[0]()
lst[1]()
#获取闭包函数使用的变量 __closure__,cell_contents(了解) #如果为none则不是闭包
print(res)
tup=res.__closure__
print(tup)
#cell_contents 功能:获取单元格对象里面的内容
jiejie=tup[0].cell_contents
meimei=tup[1].cell_contents
print(jiejie,meimei)
jiejie()
meimei()
5.闭包函数的特点
内函数使用了外函数的局部变量,改局部变量与内函数发生绑定,延长了改变量的生命周期
#函数的定义处
def outer(var):
def inner(num):
return num+var
return inner
#函数的调用处
func=outer(5)
res=func(4)
print(res)
'''
代码解析:
1.实参5和形参var一一对应,进行接收
因为内函数inner和var进行绑定,延长了var变量的生命周期,不释放
func=outer()<====>func=inner
2.实参4和形参num一一对应,进行接收num=4
return num+var<====>return 9
res=9
'''
6.闭包函数的意义
闭包可以优先使用外部函数的局部变量
局部变量在函数外部不能被直接使用
#模拟鼠标点击操作
click_num=0
def click_func():
global click_num
click_num+=1
print(click_num)
click_func()
click_func()
click_func()
click_num=100
click_func()
#方法二
def outer():
click_num=0
def inner():
nonlocal click_num
click_num+=1
print(click_num)
return inner
click_func=outer()
click_func()
click_func()
click_func()
click_func()
click_num=100
click_func()
7.匿名函数 (lambda 表达式)
只有返回值的函数,特点:简洁,高效,方便
语法结构:
lambda 参数: 返回值
#1.无参的lambda表达式
'''def func():
return '我是个诗人' '''
#改写lambda
func=lambda:'我是个诗人'
res=func()
print(res)
#2.无参的lambda表达式
def func(n):
return type(n)
#lambda改写
func=lambda n : type(n)
res=func(18)
print(res)
#3.带有判断条件的lambda表达式
def func(n):
if n % 2==0:
return '偶数'
else:
return '奇数'
8.三目(元)运算符
真值if 条件表达式 else 假值
如果条件表达式为真,返回真值
否则返回假值
n=20
res='偶数' if n%2==0 else '奇数'
print(res)
#lambda改写
func=lambda n : '偶数' if n%2==0 else '奇数'
res=func(20)
print(res)
#比较大小进行输出
func=lambda x,y:x if x>y else y
res=func(6,5)
print(res)