码迷,mamicode.com
首页 > 编程语言 > 详细

python 迭代器 生成器 装饰器

时间:2017-02-04 21:07:10      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:time   play   start   next   gen   stop   consumer   and   ret   

迭代器

可以直接作用于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

 

python 迭代器 生成器 装饰器

标签:time   play   start   next   gen   stop   consumer   and   ret   

原文地址:http://www.cnblogs.com/sxlnnnn/p/6366306.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!