python 自定义迭代器 for i in 自己设计的迭代器 如何将迭代器头部返回
时间: 2023-11-29 16:05:41 浏览: 56
python生成器和迭代器区别
如果我们希望在使用自定义迭代器进行遍历时,能够回到迭代器的头部重新遍历元素,可以考虑两种方法:
1. 实现 `__iter__` 方法,返回一个新的迭代器实例。这样,每次使用迭代器时,都会创建一个新的迭代器对象。这种方法比较简单,但是可能会占用更多的内存空间。
举个例子,假设我们有一个自定义迭代器 `MyIterator`,实现了 `__iter__` 和 `__next__` 方法:
```python
class MyIterator:
def __init__(self, data):
self.data = data
self.index = -1
def __iter__(self):
return MyIterator(self.data)
def __next__(self):
self.index += 1
if self.index >= len(self.data):
raise StopIteration
return self.data[self.index]
```
我们可以使用以下代码来遍历 `MyIterator` 中的元素:
```python
my_iterator = MyIterator([1, 2, 3, 4, 5])
for i in my_iterator:
print(i)
# 输出结果为:
# 1
# 2
# 3
# 4
# 5
for i in my_iterator:
print(i)
# 输出结果为:
# 1
# 2
# 3
# 4
# 5
```
可以看到,每次使用 `for i in my_iterator` 遍历元素时,都会返回一个新的迭代器实例,因此可以重新遍历元素。
2. 通过实现一个 `reset` 方法,将迭代器的索引重置为初始状态,从而可以重新遍历元素。
举个例子,假设我们有一个自定义迭代器 `MyIterator`,实现了 `__iter__` 和 `__next__` 方法,并添加了 `reset` 方法:
```python
class MyIterator:
def __init__(self, data):
self.data = data
self.index = -1
def __iter__(self):
return self
def __next__(self):
self.index += 1
if self.index >= len(self.data):
raise StopIteration
return self.data[self.index]
def reset(self):
self.index = -1
```
我们可以使用以下代码来遍历 `MyIterator` 中的元素,并重新遍历元素:
```python
my_iterator = MyIterator([1, 2, 3, 4, 5])
for i in my_iterator:
print(i)
# 输出结果为:
# 1
# 2
# 3
# 4
# 5
my_iterator.reset()
for i in my_iterator:
print(i)
# 输出结果为:
# 1
# 2
# 3
# 4
# 5
```
可以看到,通过调用 `reset` 方法,我们将迭代器的索引重置为-1,从而可以重新遍历元素。
阅读全文