python 生成器,迭代器,闭包,装饰器
1.生成器,迭代器,闭包,装饰器的优点
生成器就是一类特殊的迭代器
迭代器的优点也即生成器的优点:
1、节约内存。python在使用生成器时对延迟操作提供了支持。
2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的。
装饰器就是一类特殊的闭包
闭包的优点:可以实现代码复用性,防止代码冗余,就是让这些变量的值始终保持在内存中,不会在调用后被自动清除。
装饰器的优点:1.在不修改原功能模块代码前提下,还能增加新的功能
2.可以实现代码复用性,防止代码冗余(装饰器就是一类特殊的闭包)
2.生成器,迭代器,闭包,装饰器的特点
在python中创建生成器
在python中,有两种创建生成器的方式:
1、生成器表达式
类似与列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
使用列表推导,将会一次返回所有结果:
1 li=[i**2 for i in range(5)] 2 print(li) 3 4 [0, 1, 4, 9, 16] 5 [Finished in 0.3s]
将列表推导的中括号,替换成圆括号,就是一个生成器表达式:
1 li=(i**2 for i in range(5)) 2 print(li) 3 for x in range(5): 4 print(next(li))
<generator object <genexpr> at 0x0000000001E18938> 0 1 4 9 16 [Finished in 0.3s]
2、生成器函数
常规函数定义,但是使用yield语句而不是return语句返回结果。yield语句每次返回一个结果,但每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。
我们下面来看一个例子。下面为一个可以无穷生产奇数的生成器函数。
def odd(): n=1 while True: yield n n+=2 odd_num=odd() count=0 for o in odd_num: if count >=5: break print(o) count += 1
输出结果为:
1 1
2 3
3 5
4 7
5 9
6 [Finished in 0.3s]
上面的函数中,yield是必备的,当一个普通函数中包含yield时,系统会默认为是一个generator。
什么是闭包?
内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。
闭包三要素:
1、嵌套函数
2、变量的引用
3、返回内部函数
举例如下:
#定义一个嵌套函数(要素1) def test(num): def test_in(num_in): #内部函数引用外部函数的变量(非全局变量)(要素2) print("sum = %s"%(num + num_in)) #返回的结果可以被打印出来 return num,num_in #返回内部的函数(要素3) return test_in #这里的rtn就是test_in rtn = test(10) print(rtn) #内部函数test_in传参 print(rtn(20))
输出结果为:
1 <function test.<locals>.test_in at 0x000000000220E378> 2 sum = 30 3 (10, 20) 4 [Finished in 0.3s]
什么是装饰器(decorator)?
装饰器其实就是一个闭包,把一个函数当作参数然后返回一个替代版函数。
装饰器有2个特性:
1、可以把被装饰的函数替换成其他函数
2、可以在加载模块时候立即执行
举例如下:
A、装饰器对无参数函数进行装饰:
#装饰器本质就是一个闭包, #将函数当成参数传进去 def deco(fun): def inner(): print("你想进行的操作1") print("你想进行的操作2") fun() return inner #@deco是一个“语法糖” @deco # 等价于 test = deco(test) def test(): print("test函数的操作") #这个test已经被装饰了,不是原来的test test() #test()等同于如下操作: #rtn = deco(test) #rtn()
输出结果为:
1 你想进行的操作1 2 你想进行的操作2 3 test函数的操作 4 [Finished in 0.3s]
更多详细的知识点可参考:
https://www.cnblogs.com/tianyiliang/p/7811041.html