python中的yield关键字
为了理解yield关键字,首先我们要看一下iterable和iterator。
iterable 和 iterator
在python中,对可iterable的对象使用iter()方法会生成一个iterator。如下:
>>> str = "ab"
>>> iterator = iter(str)
>>> next(iterator)
'a'
>>> next(iterator)
'b'
需要注意的是一个iterator只能使用一次。当iterator将对象遍历完之后,就会抛出异常。
>>> next(iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
当我们在python中使用for in
语句时,其实python是对一个可iterable的对象进行处理,首先生成其iterator,接着不断调用next()
>>> for ch in str:
... print(ch)
a
b
c
d
iterator的官方定义如下:
Iterator
一个代表了数据流的对象。反复调用__next__()方法,不断返回数据流中的数据,直至数据耗尽,抛出StopIteration异常。Iterator需要定义__iter__()方法用于Iterator Object本身。
为什么需要iterator
考虑一个集合存储了许多元素无法同时加载到内存中,这时我们就可以使用iterator,只有使用时才将其加载出来。
generator
generator是一种特殊的iterator,其通过调用一个包含yield关键字的函数或者generator expression生成。
# generator expression
>>> gen_expr = (x**2 for x in range(3))
>>> gen_expr
<generator object <genexpr> at 0x7fbf01547740>
>>> for num in gen_expr:
... print(num)
...
0
1
4
# 使用yield关键字
>>> def create_generator():
... for i in range(3):
... yield i**2
...
>>> gen_yield = create_generator()
>>> next(gen_yield)
0
>>> for i in gen_yield:
... print(i)
...
1
4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY