• Python中yield返回生成器的详细方法


    最简单、直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器。

    要理解 yield 的作用,必须理解生成器是什么?

    在理解生成器之前,必须先理解迭代器。

    一、迭代器

    逐项读取列表,称为迭代。

    mylist = [1, 2, 3]
    for i in mylist: # 可迭代对象
        print(i)
    

    列表解析式同样是一个迭代器。

    mylist = [x*x for x in range(3)]
    for i in mylist:
        print(i)
    '''
    0
    1
    4
    '''
    

    所有 for...in... 都是迭代器,包括列表、字符串、文件等等。

    但是,迭代器所有的值都存储在内存中,十分浪费内存。

    因此有了生成器的概念。

    二、生成器

    生成器是一种迭代器,这种迭代器只能迭代一次。

    生成器不会一次性存储所有的值,而是会动态的生成值。

    mygenerator = (x*x for x in range(3))
    for i in mygenerator:
        print(i)
    

    生成器只可执行一次,再次执行时不会输出任何东西。

    三、yield

    1.例子一

    yield 类似于 return 关键字,只是函数将返回一个生成器。

    # 创建生成器
    def createGenerator():
        mylist = range(10)
        for i in mylist:
            print(i) # 验证函数调用时并无执行
            yield i*i
    mygenerator = createGenerator()    
    print(mygenerator) 
    # <generator object createGenerator at 0x0000029E88FDCA50>
    
    # 使用生成器
    for i in mygenerator:
        print(i)
    
    # 再次执行 返回为空 没有值了
    

    函数将返回一组只需要读取一次的值,可以大大的提升代码性能。

    在调用函数时,函数体中的代码并不会执行,函数只返回生成器对象。

    代码每次从使用生成器时停止的地方继续。

    2.例子二

    #Python学习交流群:531509025
    
    # 学习另外一个例子
    def foo():
        print("starting...")
        while True:
            res = yield 4 # 函数并不真正执行
            print("res:", res)
    
    g = foo() # 得到一个生成器对象
    print(next(g)) # 真正执行
    print("*"*20)
    print(next(g)) # 从上一次停止的地方继续执行
    '''
    starting...
    4
    ********************
    res: None
    4
    '''
    
    print(g.send(7))
    

    执行 yield 之后,才会跳出 while 循环。

    • next 函数用于执行下一步操作。

    • send 函数用于发送一个参数给生成器。且 send 方法中包含 next 方法。

    结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

    Python基础入门教程推荐:更多Python视频教程-关注B站:Python学习者
    https://www.bilibili.com/video/BV1LL4y1h7ny?share_source=copy_web

    Python爬虫案例教程推荐:更多Python视频教程-关注B站:Python学习者
    https://www.bilibili.com/video/BV1QZ4y1N7YA?share_source=copy_web

  • 相关阅读:
    java.lang.NoClassDefFoundError: org/activiti/validation/ProcessValidator
    java.lang.NoClassDefFoundError: org/activiti/image/ProcessDiagramGenerator
    14.10.1 InnoDB Disk I/O
    shiro权限验证标签
    14.9.4 COMPACT and REDUNDANT Row Formats
    Spring整合Shiro做权限控制模块详细案例分析
    14.9.2 Specifying the Row Format for a Table 指定 表的行格式
    全虚拟化与半虚拟化的实现方式
    全虚拟化与半虚拟化的实现方式
    查询方式的一般使用2
  • 原文地址:https://www.cnblogs.com/xxpythonxx/p/15463109.html
Copyright © 2020-2023  润新知