函数之闭包与装饰器(自我感觉这是函数中最难理解的东西)

src="http://img2.imgtn.bdimg.com/it/u=123851531,277931001&fm=11&gp=0.jpg" width=60%>
Hello!大家好!我又双叒叕来了,咱们今天继续一起来学习python吧!
咱们今天继续昨天的学习,昨天学到了函数的内置函数,但是要到达第五层还需要把函数的闭包和装饰器给KO掉。
废话不多说,咱马上开始吧。

函数的闭包

函数的闭包就是利用了函数的局部性(这是我个人定义的词),利用函数中的内部的代码,不可以被函数外部调用。从而保证了在大项目中,避免出现由不同开发人员共同开发项目而导致的使用的变量名可能重复的全局变量污染问题。

函数的闭包是函数的一种特殊的使用方式,主要格式为一个函数中定义另一个函数。

"""函数的基础闭包格式"""
def func1():
	"""外部函数func1"""
	def func2():
		"""内部函数func2"""
		print("这是func2函数")
	print("这是func1函数")

看向上面的代码,这样我们就完成了一个简单的闭包。每个func1函数可以类比一个开发者,每个func2函数可以类比开发者开发的功能代码。每个开发者都把代码封装在函数中,利用函数的局部性,就可以避免全局污染问题。

函数之装饰器

(他来了,他来了,他带着微笑走来了^ _ ^)
在我们日常进行项目开发中,我们或多或少都会接触到别人开发的项目,然后有可能在这基础上给别人的代码增加新功能。但是我们在增加功能的时候不能直接修改别人的代码,因为有可能会影响到别人项目中原来的功能。这就涉及到项目开发的六原则之一的开闭原则。
PS:感兴趣的小伙伴可以自行了解一下开发六原则。
在这个时候,装饰器就可以很好的装逼 实现功能了。

装饰器的格式

一个装饰器需要满足的条件:
①需要是闭包函数
②内层函数需要调用外层函数的参数
③外层函数需要返回内层函数

"""装饰器"""
def outer(f):
	def inner():
		f()
	return inner
# 上面的代码就是一个装饰器基本的架构

@outer        # 调用装饰器,给函数func()装上装饰器
def func():
	print("装饰器")

func()

装饰器的结构是比较简单的,但是装饰器的执行顺序是比较难理解的。
①首先我们来看一下没装装饰器的执行结果
在这里插入图片描述
很简单对吧。
②我们再来看一下装上装饰器的执行结果
在这里插入图片描述
看到结果,有没有很惊讶,明明调用的的是func()函数,但是除了func()函数之外,装饰器的中的代码也执行了,就相当于在原代码基础上增加新功能啦,这就是装饰器的魅力了。
单个装饰器的执行流程:
红色表示第一步,蓝色表示第二步,其中@outer相当于func=outer(func)
在这里插入图片描述
两个装饰器的执行流程:
在这里插入图片描述
我觉得装饰器最难理解的地方在于怎么捋清楚他们之间的各个函数的返回值,几乎所有装饰器都是通过返回值来进行下一层函数的调用,需要明白的几个点在于调用函数与函数对象的区别,和函数之间的传参问题,把三个地方捋清楚了,就基本可以明白装饰器的原理了!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值