python day 11 blog (nonlocal与闭包,匿名函数及三目运算符)

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)

你可能感兴趣的:(python day 11 blog (nonlocal与闭包,匿名函数及三目运算符))