zoukankan      html  css  js  c++  java
  • 浅谈迭代yield

    在函数中使用迭代,传统的方法就是嵌套的for循环,其实我们完全可以使用迭代函数yield来处理迭代的过程。当程序运行到yield时,该函数会返回值并且保存当前的状态,再次调用时还会从上一次中断的地方开始直到函数迭代完成(如果使用next()语句会从当前的执行状态直接去执行下一个yield,周而复始)。假象我们先next(py1) 再执行 next(py2) 再执行next(py3)...然后再继续执行next(py1) 在执行next(py2)...是不是想到了资源的调度,想到了协程。yield函数准确讲是一个没有return的函数或者说它不是一个函数而是一个generator生成器,至少包括一个yield.迭代器就是实现了工厂模式的对象,它在你每次你询问要下一个值的时候给你返回。比如itertools函数返回的都是迭代器对象。
    通过一段代码了解 yield 与 yield from的区别:
    使用yield

    if __name__ == '__main__':
        mstr = "your phone"
        mlist = [1, 2, 3, 4, 5, 6]
        mdict = {"phone": "198232423100", "count": 13}
        # generate
        result1 = (i for i in range(4, 8))
    
        def gen(*args, **kw):
            for item in args:
                print(item)
                for i in item:
                    yield i
    
        new_list = gen(mstr, mlist, mdict, result1)
        print(list(new_list))
    

    使用yield from

    if __name__ == '__main__':
        mstr = "your phone"
        mlist = [1, 2, 3, 4, 5, 6]
        mdict = {"phone": "198232423100", "count": 13}
        # generate
        result2 = (i for i in range(4, 8))
        def gens(*args, **kw):
            for item in args:
                    yield from item
    
        new_list = gens(mstr, mlist, mdict, result2)
        print(list(new_list))
    

    运行结果:

    yield from iterable 实际上等同于 for item in iterable: yield item

  • 相关阅读:
    kube-apiserver
    深度学习三:卷积神经网络
    深度学习二:概率和反向传播的变种
    深度学习一:深度前馈网络和反向传播
    Knowledge 1:Propositional Logic 命题逻辑基础及符号
    评估方法:留出法、交叉验证法、自助法、调参与最终模型
    你曾这样问过
    套路总结
    NOI2020游记
    curl不是内部或外部命令,也不是可运行的程序或批处理文件
  • 原文地址:https://www.cnblogs.com/supershuai/p/12408814.html
Copyright © 2011-2022 走看看