python闭包、装饰器和nonlocal、global

闭包

def A(num):
	def incr(num1):
		return num+num1
	return incr
if __name__ == '__main':
	a = A(4)
	print(a(5))

incr和num1是闭包

def line_conf(a, b):
	def line(x):
		return a*x+b
if __name__ == '__main__':
	a = line_conf(1,1)
	b = line_conf(4,5)
	print(a(5))
	print(b(5))

a,b是y=x+1、y=4x+5,得到不同直线表达函数,闭包提高了代码复用性。

装饰器

func,表示是函数,指向定义的函数;func(),表示执行该函数。
装饰器是python遵循开放封闭原则。该原则适用面向对象和函数式编程。
开放:扩展开发
封闭:已实现功能代码块
装饰器:@函数名 == 函数名(另一函数)

装饰器功能

decorator

  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前预备功能
  4. 执行函数后清理功能
  5. 权限校验等场景
  6. 缓存

装饰器示例

无参数的函数
被装饰的函数有参数
被装饰的函数有不定长参数
装饰器中的return
装饰器带参数,在原有装饰器的基础上,设置外部变量
类装饰器-__call__

global、nonlocal

函数内部使用与全局变量同名变量,不修则是全局变量,修就是局部变量
global关键字修饰函数局部变量后标志是全局变量
嵌套函数和函数存在与全局变量同名变量,使用但不修都为全局变量;
函数修改变量值,被标识为该函数的局部变量,嵌套使用的该函数的局部变量;
嵌套函数修改变量值,被标识为该嵌套函数的局部变量,嵌套的修改不影响函数中同名函数和全局变量。
global可以在任何地方修饰变量;nonlocal只能在嵌套函数中,且该变量是嵌套函数的函数中的同名变量,两者不能同时在同一函数中
如果在函数中使用global修饰了变量,那么在嵌套函数中用nonlocal修饰同名变量会发生报错,因为nonlocal表示该变量在函数中已经定义,但检查时因为同名变量被global修饰为全局变量,所以不存在同名的局部变量,从而导致错误。

def A(num):
	num += 1
	print(num)
	def incr(num1):
		nonlocal num
		num = 9
		print(num)
		return num+num1
	return incr
if __name__ == '__main':
	a = A(4)
	print(a(5))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值