标签:... iterator generator python yield next 关键字 gen
为了理解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
参考
- https://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators
- https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
标签:...,iterator,generator,python,yield,next,关键字,gen 来源: https://www.cnblogs.com/pitaya01/p/16349420.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。