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
  • 相关阅读:
    EMV/PBOC解析(三) TLV格式解析(C#)
    写自己的WPF样式
    EMV/PBOC 解析(二) 卡片数据读取
    FLEX 图片拷贝
    重学浏览器(2)-进程间的交互
    重学浏览器(1)-多进程多线程的浏览器
    实现财务自由-《富爸爸穷爸爸》读书语句摘抄
    mini-css-extract-plugin简介
    egg.js路由的优雅改造
    node中异步IO的理解
  • 原文地址:https://www.cnblogs.com/sxlnnnn/p/6366306.html
Copyright © 2011-2022 走看看