python_函数嵌套、闭包函数、匿名函数

1.怎么理解 locals()globals() 方法?
作用就是用来获取作用域中内容,一个当前,一个全局,然后返回字典格式
2.locals()globals() 在函数内外部调用的结果是不同的,区别的点在哪里呢?
locals 如果在函数外,调用locals(),获取的是打印之前的所有变量,返回字典,全局空间作用域
locals 如果在函数内,调用locals(),获取的是调用之前的所有变量,返回字典,局部空间作用域
globals 如果在函数外,调用globals(),获取的是打印之前的所有变量,返回字典,全局空间作用域
globals 如果在函数内,调用globals(),获取的是调用之前的所有变量,返回字典,全局空间作用域
3.定义变量的两种方式:
	1.正常方式定义变量
	2.通过系统的全局字典添加键值对,可以动态创建全局变量
	dic = globals()
	print(dic)
	# 传递字符串,创建一个变量
	k = "wangwen"
	dic[k] = "英俊潇洒的人"
	print(wangwen)
	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)

1.函数的嵌套:内函数、外函数
2.内函数的一些东西:
(1)内部函数可以直接在函数外部调用么 不可以!
(2)调用外部函数后,内部函数可以在函数外部调用吗  不可以!
(3)内部函数可以在函数内部调用吗  可以
(4)内部函数在函数内部调用时,是否有先后顺序 有(必须先定义在调用)
3.LEGB原则:就近原则
B —— Builtin(Python);Python内置模块的命名空间      (内建作用域)
G —— Global(module); 函数外部所在的命名空间        (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域            (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找
1.nonlocal 关键字的作用:修改局部变量
nonlocal  遵循 LEGB
(1) nonlocal 专门用来修改当前作用域上一级的局部变量
	def outer():
		a = 41
		def inner():
			
			def smaller():
				nonlocal a
				a = 42
				print(a)
			smaller()
			print(a) # 41 or 42?
		inner()
		print(a)
		
	outer()
(2) 如果上一级找不到,那么继续向上寻找
(3) 全都找不到,直接报错.
(4)	不适用nonlocal,是否可以修改局部变量呢?
	def outer():
		lst = [1,2,42]
		def inner():
			lst[-1] = 52
		inner()
		print(lst)
	outer()
		
1.闭包函数
	内函数使用了外函数的局部变量
	外函数将内函数返回出来的过程,叫做闭包
	里面的内函数叫做闭包函数
2.闭包函数的升级用法:
def weifuqiang_family():
	father = "马云"
	jiejie = "马蓉"
	meimei = "马诺"
	money = 1000
	
	def jiejie_hobby():
		nonlocal money
		money -= 700
		print("爱包包,爱手表,爱经纪人,把家里的钱都败光了,还剩下%s元" % (money))

	def meimei_hobby():
		nonlocal money
		money -= 200
		print("我宁愿在宝马里面哭,在不愿意在自行车上面撒欢,家里的钱还剩下%s元" % (money))

	def big_master():
		return [jiejie_hobby,meimei_hobby]


	return big_master
func = weifuqiang_family()
print(func)
lst = func()
# [<function weifuqiang_family.<locals>.jiejie_hobby at 0x000001DFB2F037B8>, <function weifuqiang_family.<locals>.meimei_hobby at 0x000001DFB2F03840>]
print(lst)

# 获取姐姐这个函数
jiejie = lst[0]
# 获取妹妹这个函数
meimei = lst[1]
jiejie()
meimei()
3.获取闭包函数使用的变量  __closure__ , cell_contents
tup = func.__closure__
print(tup)
# cell_contents 功能: 获取单元格对象里面的内容
jiejie = tup[0].cell_contents
meimei = tup[1].cell_contents
print(jiejie)
jiejie()
meimei()
1.闭包函数的特点:
内函数使用了外函数的局部变量,该局部变量与内函数发生绑定,延长该变量的生命周期
2.闭包函数的意义:
闭包可以优先使用外函数的局部变量
局部变量在函数外部不能被直接使用
对局部变量实现了保护的作用,外部无法访问;
1.匿名函数
用一句话来表达只有返回值的函数 , 特点: 简洁 , 高效 ,方便
2.语法结构
lambda 参数 : 返回值
3.三元运算符
真值 if 条件表达式 else 假值
如果条件表达式成立,为真,返回真值'
如果条件表达式不成立,为假,返回假值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值