闭包函数,函数的嵌套,匿名函数

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值