zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Casperjs循环执行(重复执行不退出)
    casperjs批量执行多个url
    CasperJS API介绍
    phantomjs waitFor
    phantomjs 长图截屏
    Linux Shell函数
    全废话SQL Server统计信息(2)——统计信息基础
    JavaScript推断undefined的技巧
    Activity Test1
    Android触摸事件(五)-CropBitmapActivity关于裁剪工具的使用
  • 原文地址:https://www.cnblogs.com/sxlnnnn/p/6366306.html
Copyright © 2011-2022 走看看