目录
用yield实现打印斐波拉切数列——升级版" >用yield实现打印斐波拉切数列——升级版
如何判断一个函数是否是一个特殊的generator函数" >如何判断一个函数是否是一个特殊的generator函数
用yield实现大文件读取" >用yield实现大文件读取
yield 和 yield from 用法对比" >yield 和 yield from 用法对比
使用yield拼接可迭代对象" >使用yield拼接可迭代对象
使用yield from拼接可迭代对象" >使用yield from拼接可迭代对象
首页 后端开发 Python教程 python yield和yield from用法总结详解

python yield和yield from用法总结详解

Aug 19, 2020 pm 05:08 PM
python yield

python yield和yield from用法总结详解

python yield和yield from用法总结

yield 作用:

注: generator的next()方法在python 2中为next(),但在python 3中为 __next__() 【next的前后各是两个下划线】

  把一个函数变成一个generator,带有yield的函数不再是一个普通函数。即:一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

用print实现打印斐波拉切数列 ——基础版

#!/usr/bin/env python
# -*- coding: utf-8 -*-def fab(max):
    n , a, b = 0, 0 , 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1if __name__ == &#39;__main__&#39;:
    fab(6)  # 1 1 2 3 5 8
#!/usr/bin/env python
# -*- coding: utf-8 -*-def fab(max):
    n , a, b = 0, 0 , 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1if __name__ == &#39;__main__&#39;:
    for n in fab(6): # 1 1 2 3 5 8
        print(n)
#!/usr/bin/env python
# -*- coding: utf-8 -*-from inspect import isgeneratorfunction

def fab(max):
    n , a, b = 0, 0 , 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1if __name__ == &#39;__main__&#39;:
    f1 = fab(3)
    # True fab是一个generator function
    print(isgeneratorfunction(fab))

    # False fab(3)不是一个generator function
    # 而fab(3)是调用fab返回的一个generator    print(isgeneratorfunction(fab(3)))
#!/usr/bin/env python
# -*- coding: utf-8 -*-def read_file(fpath):
    BLOCK_SIZE = 100
    with open(fpath, "rb") as f:
        while True:
            block = f.read(BLOCK_SIZE)
            if block:
                yield block            else:
                returnif __name__ == &#39;__main__&#39;:
    fpath = "/home/exercise-python3.7.1/vote/mysite/mysite/polls/test.txt"
    read_gen = read_file(fpath)

    print(read_gen.__next__())
    print(read_gen.__next__())
    print(read_gen.__next__())
    print(read_gen.__next__())

    # for循环会自动调用generatr的__next__()方法,故输出效果同如上的4个print  【内容较短,4个print就将test.txt中的内容输出完了】    for data in read_gen:
        print(data)
#!/usr/bin/env python
# -*- coding: utf-8 -*-if __name__ == &#39;__main__&#39;:
    astr = "ABC"
    alist = [1, 2, 3]
    adict = {"name": "wangbm", "age": 18}
    # generate
    agen = (i for i in range(4, 8))

    def gen(*args, **kw):
        for item in args:
            for i in item:
                yield i

    new_list = gen(astr, alist, adict, agen)
    print(list(new_list))
    # [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, 1, 2, 3, &#39;name&#39;, &#39;age&#39;, 4, 5, 6, 7]
#!/usr/bin/env python
# -*- coding: utf-8 -*-if __name__ == &#39;__main__&#39;:
    astr = "ABC"
    alist = [1, 2, 3]
    adict = {"name": "wangbm", "age": 18}
    # generate
    agen = (i for i in range(4, 8))

    def gen(*args, **kw):
        for item in args:
            yield from item

    new_list = gen(astr, alist, adict, agen)
    print(list(new_list))
    # [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, 1, 2, 3, &#39;name&#39;, &#39;age&#39;, 4, 5, 6, 7]

结论:
  由上面两种方式对比,可以看出,yield from后面加上可迭代对象,他可以把可迭代对象里的每个元素一个一个的yield出来,对比yield来说代码更加简洁,结构更加清晰。

相关学习推荐:python视频教程

以上是python yield和yield from用法总结详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何处理Python中的API身份验证 如何处理Python中的API身份验证 Jul 13, 2025 am 02:22 AM

处理API认证的关键在于理解并正确使用认证方式。1.APIKey是最简单的认证方式,通常放在请求头或URL参数中;2.BasicAuth使用用户名和密码进行Base64编码传输,适合内部系统;3.OAuth2需先通过client_id和client_secret获取Token,再在请求头中带上BearerToken;4.为应对Token过期,可封装Token管理类自动刷新Token;总之,根据文档选择合适方式,并安全存储密钥信息是关键。

python循环在元组上 python循环在元组上 Jul 13, 2025 am 02:55 AM

在Python中,用for循环遍历元组的方法包括直接迭代元素、同时获取索引和元素、以及处理嵌套元组。1.直接使用for循环可依次访问每个元素,无需管理索引;2.使用enumerate()可同时获取索引和值,默认索引起始为0,也可指定start参数;3.对嵌套元组可在循环中解包,但需确保子元组结构一致,否则会引发解包错误;此外,元组不可变,循环中不能修改内容,可用\_忽略不需要的值,且建议遍历前检查元组是否为空以避免错误。

如何在Python中制作异步API 如何在Python中制作异步API Jul 13, 2025 am 02:01 AM

Python实现异步API调用首选async/await搭配aiohttp。使用async定义协程函数并通过asyncio.run驱动执行,例如:asyncdeffetch_data():awaitasyncio.sleep(1);通过aiohttp发起异步HTTP请求,需用asyncwith创建ClientSession并await响应结果;并发多个请求可使用asyncio.gather打包任务列表;注意事项包括:避免阻塞操作、不混用同步代码、Jupyter需特殊处理事件循环。掌握eventl

什么是python中的纯粹功能 什么是python中的纯粹功能 Jul 14, 2025 am 12:18 AM

纯函数在Python中是指给定相同输入始终返回相同输出且没有副作用的函数。其特点包括:1.确定性,即相同输入总是产生相同输出;2.无副作用,即不修改外部变量、不改变输入数据、不与外界交互。例如,defadd(a,b):returna b是纯函数,因为无论调用多少次add(2,3),都始终返回5,且不更改程序中的其他内容。相较而言,修改全局变量或改变输入参数的函数则是非纯函数。纯函数的优势有:更容易测试、更适合并发执行、可缓存结果提升性能,并能良好配合函数式编程工具如map()和filter()。

如何防止方法在Python中被覆盖? 如何防止方法在Python中被覆盖? Jul 13, 2025 am 02:56 AM

在Python中,虽然没有内置的final关键字,但可通过名称改写、运行时异常、装饰器等方法模拟不可覆盖的方法。1.使用双下划线前缀触发名称改写,使子类难以覆盖方法;2.在方法中判断调用者类型并抛出异常,阻止子类重定义;3.使用自定义装饰器标记方法为final,并结合元类或类装饰器进行检查;4.可将行为封装为property属性以减少被修改的可能性。这些方式提供了不同程度的保护,但都无法完全强制限制覆盖行为。

如果还有其他在Python 如果还有其他在Python Jul 13, 2025 am 02:48 AM

ifelse是Python中用于条件判断的基础结构,通过条件的真假执行不同代码块。它支持多条件判断时使用elif添加分支,且缩进是语法关键;如num=15时,程序输出“这个数字大于10”;若需简化赋值逻辑,可用三元运算符如status="成年人"ifage>=18else"未成年人"。1.ifelse根据条件真假选择执行路径;2.elif可添加多个条件分支;3.缩进决定代码归属,错误会导致异常;4.三元运算符适用于简单赋值场景。

Python类可以有多个构造函数吗? Python类可以有多个构造函数吗? Jul 15, 2025 am 02:54 AM

Yes,aPythonclasscanhavemultipleconstructorsthroughalternativetechniques.1.Usedefaultargumentsinthe__init__methodtoallowflexibleinitializationwithvaryingnumbersofparameters.2.Defineclassmethodsasalternativeconstructorsforclearerandscalableobjectcreati

python for Loop范围 python for Loop范围 Jul 14, 2025 am 02:47 AM

在Python中,使用for循环配合range()函数是控制循环次数的常见方式。1.当明确知道循环次数或需按索引访问元素时使用;2.range(stop)从0到stop-1,range(start,stop)从start到stop-1,range(start,stop,step)加入步长;3.注意range不包含结束值,且在Python3返回可迭代对象而非列表;4.可通过list(range())转换为列表,倒序时用负步长。

See all articles