📜  Python迭代器(1)

📅  最后修改于: 2023-12-03 15:19:36.438000             🧑  作者: Mango

Python迭代器

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

以上实例我们可以使用 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 语句来返回值。