python装饰器、迭代器、生成器

装饰器:为已存在的函数或者或者对象添加额外的功能

 1 def wrapper(f):    #装饰器函数,f是被装饰的函数
 2     def inner(*args,**kwargs):
 3         '''在被装饰函数之前要做的事'''
 4         print("AAAA")
 5         ret = f(*args,**kwargs)    #被装饰的函数
 6         '''在被装饰函数之后要做的事'''
 7         print("BBBB")
 8         return ret
 9     return inner
10 
11 @wrapper         #语法糖 @装饰器函数名
12 def func(a,b):     #被装饰的函数
13     time.sleep(0.01)
14     print('大家好',a,b)
15     return '新年好'
16 
17 func(2,5)

打印结果如下

迭代器:在python中如果一个对象有_iter_()和_next_()方法,则称该对象是迭代器(Iterator),其中_iter_()方法可以让对象使用for...in循环遍历,_next_()方法糖对象可以通过next(实例名)访问下一个元素

可迭代在python中一个一个对象有_iter_()方法或_getitem_()方法,称该对象为可迭代的(Iterable),_iter_()让对象使用for循环,_getitem_()方法是让对象可以通过“实例名[index]”的方式访问实例中的元素

# 迭代器
l = [1, 2, 3]
# for i in l:
#     i:

print(dir([]))  # 列表拥有的方法
"""
['__add__', '__class__', '__contains__', '__delattr__',
 '__delitem__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__getitem__', '__gt__',
'__hash__', '__iadd__', '__imul__', '__init__', 
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__',
'__setitem__', '__sizeof__', '__str__', '__subclasshook__',
'append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
"""
# 双下划线的是双下方法
print([1].__add__([2]))  # -->[1, 2]
print([1] + [2])  # -->[1, 2]

ret = set(dir([])) & set(dir({})) & set(dir('')) & set(dir(range(10)))
print(ret)  # iterable  __iter__

# 判断
print('__iter__' in dir([].__iter__()))  # True
print('__next__' in dir([].__iter__()))  # True

from collections import Iterable  # Iterable:可迭代对象
from collections import Iterator  # Iterator迭代器

print(isinstance([], Iterator))  # False  列表不是一个迭代器
print(isinstance([], Iterable))  # True   列表是可迭代的

a = [1, 2, 3, 4]
for b in a.__iter__():
    print(b)

# 打印结果1,2,3,4

生成器:生成器函数generator与定义普通函数一样,唯一不同的是生成器函数有一个或者多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,yidel是将数据返回后继续运行函数

def generator():
    print(1)
    return 'a'
ret = generator()
print(ret)     # 结果:1   a


# 生成器函数(含有yield关键字)
def generator1():
    print(1)
    yield 'a'

ret = generator1()
print(ret)   # 结果: <generator object generator1 at 0x0000016AFEFDCF68>
ret.__next__()   # 结果:1
ret.__iter__()

生成器进阶:

 1 # 计算移动平均值(1)
 2 def averager():
 3     total = 0.0
 4     count = 0
 5     average = None
 6     while True:
 7         term = yield average
 8         total += term
 9         count += 1
10         average = total / count
11 
12 
13 g_avg = averager()
14 next(g_avg)
15 print(g_avg.send(10))
16 print(g_avg.send(30))
17 print(g_avg.send(5))
18 # 结果:10.0,20.0,15.0
19 
20 # 计算移动平均值(2)_预激协程的装饰器
21 def init(func):  # 在调用被装饰生成器函数的时候首先用next激活生成器
22     def inner(*args, **kwargs):
23         g = func(*args, **kwargs)
24         next(g)
25         return g
26 
27     return inner
28 
29 
30 @init
31 def averager():
32     total = 0.0
33     count = 0
34     average = None
35     while True:
36         term = yield average
37         total += term
38         count += 1
39         average = total / count
40 
41 
42 g_avg = averager()
43 # next(g_avg)   在装饰器中执行了next方法
44 print(g_avg.send(10))
45 print(g_avg.send(30))
46 print(g_avg.send(5))
47 # 打印结果10.0,20.0,15.0
原文地址:https://www.cnblogs.com/xiaolu915/p/10528905.html