博客
关于我
python中yield的用法详解——最简单,最清晰的解释
阅读量:798 次
发布时间:2023-03-09

本文共 1417 字,大约阅读时间需要 4 分钟。

Python中的yield关键字主要用于定义生成器函数,生成器函数可以通过yield关键字产生可迭代对象。生成器函数能够在不存储所有数据的情况下,按需生成和处理数据,非常适合处理大量或无限数据的情况。

生成器函数的基本用法

def foo():    print("starting...")    while True:        res = yield 4        print("res:", res)

调用生成器函数

g = foo()print(next(g))  # 输出: starting...4print("*" * 20)print(next(g))  # 输出: res: None4

代码解释

  • 生成器函数的定义:def foo(): 定义了一个生成器函数,函数体内有一个无限循环while True:。
  • 第一次调用next(g):
    • 生成器函数开始执行,首先打印"starting..."。
    • 进入while循环,执行res = yield 4,这里yield 4会暂停函数的执行,并返回4给调用者。
    • 所以,第一次调用next(g)会输出starting...4。
  • 打印20个星号:这不会影响生成器的执行,仅仅是打印一个字符串。
  • 第二次调用next(g):
    • 生成器函数从上次yield的位置继续执行。
    • res = yield 4,因为上一次没有传递值,所以res会是None。
    • 所以,第二次调用next(g)会输出res: None。
    • 接着,函数继续到yield 4,第三次调用next(g)会再次返回4。
  • 生成器的优势

    • 内存优化:生成器不会在内存中存储所有数据,而是按需生成数据,非常适合处理大数据或无限数据。
    • 资源管理:生成器可以用来控制资源的使用,比如数据库连接、文件读取等。
    • 并行处理:生成器可以在多个方面实现并行处理,例如并行读取文件内容。

    更高级的生成器用法

    def foo(num):    print("starting...")    while num < 10:        num += 1        yield num
    for n in foo(0):    print(n)

    代码解释

  • 生成器函数定义:def foo(num): 定义了一个接受参数num的生成器函数。
  • 循环执行:while num < 10:,当num小于10时,执行循环体。
  • 生成值:yield num,每次循环都会生成当前的num值,然后暂停。
  • 调用生成器函数:for n in foo(0):,调用生成器函数,按需生成值,并打印每个值。
  • 进一步优化

    import itertools
    horses = [1, 2, 3, 4]races = itertools.permutations(horses)print(list(races))

    代码解释

  • 导入库:import itertools。
  • 定义列表:horses = [1, 2, 3, 4]。
  • 生成排列组合:races = itertools.permutations(horses)。
  • 转换为列表:print(list(races)),将生成器对象转换为列表对象。
  • 总结

    生成器函数通过yield关键字,可以按需生成数据,不需要存储所有数据在内存中,非常适合处理大量或无限数据。同时,生成器函数可以灵活控制资源的使用,提升程序的效率和性能。

    转载地址:http://gilfk.baihongyu.com/

    你可能感兴趣的文章