python 迭代器 生成器 装饰器

迭代器

可以直接作用于for循环的对象统称为可迭代对象(Iterable)。

可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。

所有的Iterable均可以通过内置函数iter()来转变为Iterator。

names = iter(['sun', 'ibm', 'sunny'])
print(names)
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())

#第一个输出打印迭代器对象
#第二三四次next方法每次都去获取迭代对象的值,每次往下取一个值,直到取完
#第五次输出    print(names.__next__())
#StopIteration,因为迭代器里面的对象已经取完了,所以出现这个异常
View Code

生成器

在Python中,这种一边循环一边计算的机制,称为生成器:generator

def fib(max):
    n,a,b = 0,0,1
    while n < max:
        #print(b)
        yield  b
        a,b = b,a+b
        n += 1
    return 'done'

data = fib(10)
print(data)

print(data.__next__())
print(data.__next__())
print("干点别的事")
print(data.__next__())
print(data.__next__())
print(data.__next__())
print(data.__next__())
print(data.__next__())
View Code

生成器的异步应用

import time


def consumer(name):  # 定义消费者函数
    print("%s 准备吃包子啦!" % name)  # 打印消费者名字
    while True:
       baozi = yield  # 当代码运行到这时,返回一个迭代器对象,当对象第二次调用时,会接收值并赋值给baozi
       print("包子[%s]来了,被[%s]吃了!" % (baozi, name))  # 打印当前使用的迭代器对象,及接收的值


def producer(*name):  # 定义一个生产者函数,并使用动态参数
    if len(name) == 3:  # 当传入三个参数时,调用三次消费者函数方法
        c = consumer(name[0])
        c2 = consumer(name[1])
        c3 = consumer(name[2])
    c.__next__()  # 通过函数内置方法获取迭代器内部元素
    c2.__next__()
    c3.__next__()
    print("老子开始准备做包子啦!")
    for i in range(1, 11):
        time.sleep(1)
        print("做了%s个包子!" % len(name))
        c.send(i)  # 通过迭代器方法的send属性给生成器传送值
        c2.send(i)
        c3.send(i)

producer("alex", 'zengchunyun', 'peiqi')  # 创建一个生产者对象,并传入三个消费者名字
View Code

装饰器

def wrapper(func):
    def inner(name):
        func(name)
    return inner

@wrapper
def index(name):  
    print('welcome %s' % name)

index('alex')
View Code
原文地址:https://www.cnblogs.com/sxlnnnn/p/6366306.html