哪些Python可重用?
如果我理解正确,我们在Python中有:哪些Python可重用?,python,iterator,Python,Iterator,如果我理解正确,我们在Python中有: Iterables=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 迭代器=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 生成器=使用yield语句或生成器表达式创建的迭代器 问题:上述类别是否总是/从不可消费 我所说的消耗品,是指
- Iterables=
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
- 迭代器=
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
- 生成器=使用
语句或生成器表达式创建的迭代器yield
for x in [1,2,3]:
class PowTwoIterator:
def __init__(self, max=0):
self.max = max
self._restart()
def _restart(self):
self._n = 0
def __iter__(self):
return self
def __next__(self):
if self._n <= self.max:
result = 2 ** self._n
self._n += 1
return result
else:
raise StopIteration
for
循环正在幕后为您创建一个新的迭代器。事实上,列表
不是迭代器iter([1,2,3])
返回类型为list\u iterator
的内容,而不是列表本身
关于您在评论中链接到的示例,而不是
class PowTwo:
def __init__(self, max=0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration
第二类:
定义初始值(自,最大值=0):
self.max=max
定义(自我):
self.n=0
回归自我
定义下一个(自我):
if self.n Small correction:yield
在def
语句中创建一个生成器,但您也可以使用生成器表达式创建一个生成器,例如(x代表[1,2,3]中的x])
!所以range()对象不是迭代器,而是iterable?正确;特别是,range.\uuuu iter\uuuu
的CPython实现返回range\u迭代器
类型的内容。非常感谢!最后一个问题:我看到自定义迭代器不是可消费的,因此我感到困惑(对于本教程中的类“powtoo:”)。那么,这被认为是不好的做法,还是所有内置Python迭代器都遵循非消耗性的经验法则?我认为这是不好的做法,如果仅仅因为\uuu iter\uu
有副作用的话。看起来你可以创建这个类的两个独立迭代器(p=powtow2();i1=iter(p);i2=iter(p)
),但是既然i1是i2
是真的,那么推进一个就推进另一个。这是有意义的。非常感谢。