zoukankan      html  css  js  c++  java
  • Python 11 生成器

    生成器 和 生成器表达式

    迭代器
    iter() 获取迭代器
    next() 下一个

    生成器
    本质就是迭代器
    两种方式写生成器
    1. 生成器函数
    2. 生成器表达式

    一,生成器
    什么是生成器. 生成器实质就是迭代器.
    在python中有三种方式来获取生成器:

    1. 通过生成器函数
    2. 通过各种推导式来实现生成器
    3. 通过数据的转换也可以获取生成器

    首先, 我们先看个很简单的函数:

    def func():
        print("aaa")
        return bbb
    ret = func()
    print(ret)
    

    结果是 aaa
           bbb

    将函数中的return换成yield就是生成器

    def func():
        print("aaa")
        yield bbb
    ret = func()
    print(ret)
    

    结果:
    <generator object func at 0x10567ff68>
    这里的ret = fun() 就不再是函数的执行了
    . 而是获取这个生成器

    例子二 生产器打印输出

    def func():
        print("aaa")
        yield bbb
        print("ccc")
        yield ddd
        print("eee")
        yield fff
    ret = func()
    print(ret.__next__())
    print(ret.__next__())
    print(ret.__next__())
    

    生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行
    有什么区别呢? yield是分段来执行一个
    函数

    那么我们可以看到, yield和return的效果是一样的.有什么区别呢?
    yield是分段来执行一个函数.
    return呢? 直接停止执行函数. 返回值

    sen 的用法

    def eat():
      print("我吃什么啊")
      a = yield "馒头"
      print("a=",a)
      b = yield "烧饼"
      print("b=",b)
      c = yield "韭菜"
      print("c=",c)
      yield "GAME OVER"
    gen = eat() # 获取生成器
    ret1 = gen.__next__()
    print(ret1)
    ret2 = gen.send("胡辣汤")
    print(ret2)
    ret3 = gen.send("狗粮")
    print(ret3)
    ret4 = gen.send("猫粮")
    print(ret4)
    

    send和__next__()区别:

    1. send和next()都是让生成器向下走一次
    2. send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
      成器代码的时候不能使用send()
  • 相关阅读:
    ETL概述
    POI操作Excel常用方法总结
    段的创建表user_segments
    定位导致物化视图无法快速刷新的原因
    在shell脚本中调用sqlplus
    Oracle 字符集的查看和修改
    Java Web发布
    JSP搭建
    完全卸载oracle11g步骤:
    剑指offer——二叉排序树(BST)、平衡二叉树(AVL)
  • 原文地址:https://www.cnblogs.com/NATO/p/9911509.html
Copyright © 2011-2022 走看看