📅  最后修改于: 2023-12-03 15:19:36.438000             🧑  作者: Mango
Python 中的迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完毕。迭代器只能往前不会后退,而且必须实现两个方法:__iter__()
和 __next__()
。
要创建一个迭代器,必须实现 __iter__()
和 __next__()
方法。例如,以下是创建并输出一个简单的迭代器:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
输出结果:
1
2
3
在上面的例子中,MyNumbers
类被用来创建一个迭代器对象。__iter__()
方法返回了迭代器对象自身,并将数字 1
赋值给属性 self.a
。
__next__()
方法返回 self.a
并将 self.a
的值加 1。如果 __next__()
方法抛出 StopIteration
异常,则迭代结束。可以在 __next__()
方法中使用条件来决定何时引发 StopIteration
异常。
以上实例我们可以使用 StopIteration 异常来标识迭代的完成。在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。例如:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
输出结果:
1
2
3
... ...
18
19
20
可以使用 iter()
和 next()
函数访问迭代器对象,但是这不是实现迭代器的唯一方法。实际上,只要对象实现了具有如下特征的方法,它就是一个迭代器:
__iter__()
和 __next__()
方法。__iter__()
方法返回迭代器对象本身。这个对象可以是 self
。__next__()
方法返回下一个值。如果没有要返回的值,则抛出 StopIteration
异常。另外,任何对象都可以通过使用 iter()
函数和一个包含零个参数的参数调用来转换为一个迭代器。这意味着实现上述两种方法的对象是可迭代的。
例如,以下是创建一个可迭代对象并输出元组中所有数字的示例:
class MyTuple:
def __init__(self):
self.values = (1, 2, 3)
def __iter__(self):
self.count = 0
return self
def __next__(self):
if self.count < len(self.values):
value = self.values[self.count]
self.count += 1
return value
else:
raise StopIteration
mytuple = MyTuple()
for value in iter(mytuple):
print(value)
输出结果:
1
2
3
生成器是一种特殊的迭代器,它是在函数中定义的。以下是一个生成器函数的示例:
def my_generator():
n = 1
yield n
n += 1
yield n
n += 1
yield n
gen = my_generator()
print(next(gen))
print(next(gen))
print(next(gen))
输出结果:
1
2
3
注意,在函数中定义生成器时,使用 yield
语句而不是 return
语句。yield
语句的作用是返回一个值,并保留函数的状态,以便下次调用它时可以从最后一次调用的位置继续执行。调用 next()
函数时,会从上次返回 yield
的地方继续执行,并返回下一个 yield
的值。当所有的 yield
都被使用后,生成器会引发 StopIteration
异常。
迭代器提供了一种简单而有效的方法来访问集合中的元素。通过实现 __iter__()
和 __next__()
方法,可以创建可迭代的对象,这些对象可以使用 iter()
和 next()
函数来访问元素。可以在迭代过程中抛出 StopIteration
异常以结束迭代。生成器是一种特殊类型的迭代器,它被定义为函数,并使用 yield
语句来返回值。