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__ == '__main__':
fab(6) # 1 1 2 3 5 8用yield实现打印斐波拉切数列——升级版
#!/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__ == '__main__':
for n in fab(6): # 1 1 2 3 5 8
print(n)如何判断一个函数是否是一个特殊的generator函数
#!/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__ == '__main__':
f1 = fab(3)
# True fab是一个generator function
print(isgeneratorfunction(fab))
# False fab(3)不是一个generator function
# 而fab(3)是调用fab返回的一个generator print(isgeneratorfunction(fab(3)))用yield实现大文件读取
#!/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__ == '__main__':
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)yield 和 yield from 用法对比
使用yield拼接可迭代对象
#!/usr/bin/env python
# -*- coding: utf-8 -*-if __name__ == '__main__':
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))
# ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]使用yield from拼接可迭代对象
#!/usr/bin/env python
# -*- coding: utf-8 -*-if __name__ == '__main__':
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))
# ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]结论:
由上面两种方式对比,可以看出,yield from后面加上可迭代对象,他可以把可迭代对象里的每个元素一个一个的yield出来,对比yield来说代码更加简洁,结构更加清晰。
相关学习推荐:python视频教程
以上是python yield和yield from用法总结详解的详细内容。更多信息请关注PHP中文网其他相关文章!
热AI工具
Undress AI Tool
免费脱衣服图片
Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片
AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。
Clothoff.io
AI脱衣机
Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!
热门文章
热工具
记事本++7.3.1
好用且免费的代码编辑器
SublimeText3汉化版
中文版,非常好用
禅工作室 13.0.1
功能强大的PHP集成开发环境
Dreamweaver CS6
视觉化网页开发工具
SublimeText3 Mac版
神级代码编辑软件(SublimeText3)
如何处理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循环在元组上
Jul 13, 2025 am 02:55 AM
在Python中,用for循环遍历元组的方法包括直接迭代元素、同时获取索引和元素、以及处理嵌套元组。1.直接使用for循环可依次访问每个元素,无需管理索引;2.使用enumerate()可同时获取索引和值,默认索引起始为0,也可指定start参数;3.对嵌套元组可在循环中解包,但需确保子元组结构一致,否则会引发解包错误;此外,元组不可变,循环中不能修改内容,可用\_忽略不需要的值,且建议遍历前检查元组是否为空以避免错误。
如何在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中的纯粹功能
Jul 14, 2025 am 12:18 AM
纯函数在Python中是指给定相同输入始终返回相同输出且没有副作用的函数。其特点包括:1.确定性,即相同输入总是产生相同输出;2.无副作用,即不修改外部变量、不改变输入数据、不与外界交互。例如,defadd(a,b):returna b是纯函数,因为无论调用多少次add(2,3),都始终返回5,且不更改程序中的其他内容。相较而言,修改全局变量或改变输入参数的函数则是非纯函数。纯函数的优势有:更容易测试、更适合并发执行、可缓存结果提升性能,并能良好配合函数式编程工具如map()和filter()。
如何防止方法在Python中被覆盖?
Jul 13, 2025 am 02:56 AM
在Python中,虽然没有内置的final关键字,但可通过名称改写、运行时异常、装饰器等方法模拟不可覆盖的方法。1.使用双下划线前缀触发名称改写,使子类难以覆盖方法;2.在方法中判断调用者类型并抛出异常,阻止子类重定义;3.使用自定义装饰器标记方法为final,并结合元类或类装饰器进行检查;4.可将行为封装为property属性以减少被修改的可能性。这些方式提供了不同程度的保护,但都无法完全强制限制覆盖行为。
如果还有其他在Python
Jul 13, 2025 am 02:48 AM
ifelse是Python中用于条件判断的基础结构,通过条件的真假执行不同代码块。它支持多条件判断时使用elif添加分支,且缩进是语法关键;如num=15时,程序输出“这个数字大于10”;若需简化赋值逻辑,可用三元运算符如status="成年人"ifage>=18else"未成年人"。1.ifelse根据条件真假选择执行路径;2.elif可添加多个条件分支;3.缩进决定代码归属,错误会导致异常;4.三元运算符适用于简单赋值场景。
Python类可以有多个构造函数吗?
Jul 15, 2025 am 02:54 AM
Yes,aPythonclasscanhavemultipleconstructorsthroughalternativetechniques.1.Usedefaultargumentsinthe__init__methodtoallowflexibleinitializationwithvaryingnumbersofparameters.2.Defineclassmethodsasalternativeconstructorsforclearerandscalableobjectcreati
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())转换为列表,倒序时用负步长。


