栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在__iter __()中使用yield的好处是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在__iter __()中使用yield的好处是什么?

如果不遵循生成器功能,则要遵循最佳实践,则必须实现以下类似操作:

In [7]: class IterableContainer:   ...:     def __init__(self, data=(1,2,3,4,5)):   ...:         self.data = data   ...:     def __iter__(self):   ...:         return IterableContainerIterator(self.data)   ...:In [8]: class IterableContainerIterator:   ...:     def __init__(self, data):   ...:         self.data = data   ...:         self._pos = 0   ...:     def __iter__(self):   ...:         return self   ...:     def __next__(self):   ...:         try:   ...:   item = self.data[self._pos]   ...:         except IndexError:   ...:  raise StopIteration   ...:         self._pos += 1   ...:         return item   ...:In [9]: container = IterableContainer()In [10]: for x in container:    ...:     print(x)    ...:12345

当然,以上示例是人为设计的,但希望您能理解。使用生成器,可以简单地是:

In [11]: class IterableContainer:    ...:     def __init__(self, data=(1,2,3,4,5)):    ...:         self.data = data    ...:     def __iter__(self):    ...:         for x in self.data:    ...:  yield x    ...:    ...:In [12]: list(IterableContainer())Out[12]: [1, 2, 3, 4, 5]

至于状态,恰恰是-对象可以具有状态,例如属性。您可以在运行时操纵该状态。您 可以 执行以下操作,但是我不建议这样做:

In [19]: class IterableContainerIterator:    ...:     def __init__(self, data):    ...:         self.data = data    ...:         self._pos = 0    ...:     def __iter__(self):    ...:         return self    ...:     def __next__(self):    ...:         try:    ...:   item = self.data[self._pos]    ...:         except IndexError:    ...:  raise StopIteration    ...:         self._pos += 1    ...:         return item    ...:     def rewind(self):    ...:         self._pos = min(0, self._pos - 1)    ...:In [20]: class IterableContainer:    ...:     def __init__(self, data=(1,2,3,4,5)):    ...:         self.data = data    ...:     def __iter__(self):    ...:         return IterableContainerIterator(self.data)    ...:In [21]: container = IterableContainer()In [22]: it = iter(container)In [23]: next(it)Out[23]: 1In [24]: next(it)Out[24]: 2In [25]: it.rewind()In [26]: next(it)Out[26]: 1In [27]: next(it)Out[27]: 2In [28]: next(it)Out[28]: 3In [29]: next(it)Out[29]: 4In [30]: next(it)Out[30]: 5In [31]: it.rewind()In [32]: next(it)Out[32]: 1


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660990.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号