python 装饰器 生成器 迭代器和闭包

1.1装饰器

a.装饰器本质上是python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能, 装饰器的返回值也是一个函数/类对象

b.常用的需求场景 插入日志,性能测试, 权限校验等场景

(在方法执行前后插入代码片段,以此来增强原有代码的功能)

#装饰器模版
def wrapper(fn):
	def inner(*args, **kwargs):
		ret = fn(*args, **kwargs)
		retur ret
	return inner
1.2生成器

a.生成器是迭代的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器

b.python 有两种不同的方式提供生成器

生成器函数:常规函数定义,但是yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每一个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

生成器表达式(生成器表达式是用圆括号括起来的紧凑形式生成器标注。 生成器表达式会产生一个新的生成器对象。 其句法与推导相同,区别在于它是用圆括号而不是用方括号或花括号括起来的。 在生成器表达式中使用的变量会在为生成器对象调用 next() 方法的时候以惰性方式被求值(即与普通生成器相同的方式)

#实际上next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。
1 def consumer():
2     r = 'here'
3     while True:
4         n1 = yield r   #这里的等式右边相当于一个整体,接受回传值
5         if not n1:
6             return
7         print('[CONSUMER] Consuming %s...' % n1)
8         r = '%d00 OK' % n1
9
10 def produce(c):
11     aa = c.send(None)
12     n = 0
13     while n < 5:
14         n = n + 1
15         print('[PRODUCER] Producing %s...' % n)
16         r1 = c.send(n)
17         print('[PRODUCER] Consumer return: %s' % r1)
18     c.close()
19
20 c = consumer()
1.3迭代器

a.迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项, 要么引起一个StopIteration异常,以终止迭代

b.可迭代对象就是:实现了迭代器协议的对象

方法的对象都称为迭代器

# 具有__iter__方法和 __next__方法的函数 都可称为迭代器对象
# __iter__方法 能够证明为一个可迭代对象
>>> li = [11, 22, 33, 44, 55]
>>> li_iter = iter(li)
>>> next(li_iter)
11
>>> next(li_iter)
22
>>> next(li_iter)
33
>>> next(li_iter)
44
>>> next(li_iter)
55
>>> next(li_iter)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
1.4闭包

a.在一个嵌套函数中,内部函数对外部作用域的变量进行引用,那么内部函数就被称为闭包,闭包是由函数及其相关的引用环境组合而成的实体(闭包=函数+引用环境),函数可以作为另一个函数的参数或返回值,可以赋值给一个变量,函数可以嵌套定义,即在一个函数内部再定义一个函数,有了嵌套函数这种结构,便产生了闭包

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。
但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

# 计算print输出的结果
def outer_func():
    loc_list = []
    def inner_func(name):
       loc_list.append(len(loc_list) + 1)
       print(f'{name} loc_list = {loc_list}')
   return inner_func
clo_func_0 = outer_func()
clo_func_0('clo_func_0')
clo_func_0('clo_func_0')
clo_func_0('clo_func_0')
clo_func_1 = outer_func()
clo_func_1('clo_func_1')
clo_func_0('clo_func_0')
clo_func_1('clo_func_1')
# 以上代码执行结果
clo_func_0 loc_list = [1]
clo_func_0 loc_list = [1, 2]
clo_func_0 loc_list = [1, 2, 3]
clo_func_1 loc_list = [1]
clo_func_0 loc_list = [1, 2, 3, 4]
clo_func_1 loc_list = [1, 2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶知秋的BLOG

创作不易 请多多关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值