Python编程:迭代器协议与遍历,轻松搞定

上一篇 / 下一篇  2022-10-26 11:31:18

  为了回馈广大用户对51Testing软件测试网的支持,我们准备了一份价值398元的测试实战课程礼包,只需填写下方链接的行业调查问卷即可免费领取~ 链接:http://vote.51testing.com/

  迭代器协议
  在Python中,迭代器(Iterator)对象需要支持以下两个方法,它们一起构成迭代器协议:
  1)__iter__():
  对象的该方法返回迭代器对象本身。这是要求容器和迭代器与for-in语句一起使用所必需的。你也可以使用内置的iter()函数,该函数实质上是在背后调用了__iter__()方法的。
  2)__next__():
  从迭代器中返回下一项。如果没有其他项,则抛出StopIteration异常。也可以使用内置的next()函数读取下一项,其实质也是调用__next__()方法。
  正如我们在前所讲过的,列表、元组、字典和集合都是可迭代类型。换句话说,它们是可以从中获得迭代器的类型。看示例:
代码片段清单-01
  输入结果如下:
  A
  B
  C
  在示例代码中,我们定义了一个可迭代元组。然后对这个可迭代对象调用iter()函数。iter()函数返回一个迭代器,我们将其命名为tupIter。然后多次调用next()函数。next()函数每次执行时,都会自动返回迭代器中的下一项。
  再看下一段示例代码:
代码片段-02
  运行输出的结果为:
  P
  y
  在上述代码清单中,在字符串对象上调用__ iter__()方法。字符串对象实现了迭代器协议,所以字符串是包含字符序列的可迭代对象的。直接调用__ iter__()方法就可返回一个迭代器。然后再通过返回的迭代器调用__ next__()方法,就可一个一个地输出迭代器中的元素内容。
  一言以蔽之,只要实现了迭代器协议的对象,即可按照上面的两种方法进行对象的迭代调用。
  迭代器遍历
  正如我们在前介绍中看到的,我们使用next()函数(或__next__()方法)手动遍历迭代器的项。当next()函数到达迭代器的末尾时,就没有更多的数据要返回,将得到一个StopIteration异常。
  请看示例:
代码片段清单-03
  运行上述程序,输出结果类似如下:
  10
  20
  30
  Traceback (most recent call last):
  File ……, in <module>
  print(next(listIter))
  StopIteration
  在上述代码中,调用了next()函数四次,这比迭代器中的项数还要多。在最后一个调用中得到了抛出的StopIteration异常——因为迭代器内元素项已经迭代完了。而且,为保证手动迭代完成后可能抛出的异常,得自行进行异常处理,否则后续将不再正常执行。
  需要认识到的是:绝大多数场景下,我们不需要自己手动调用next方法,Python中的for循环能够自动遍历任何可以返回迭代器的对象。换句话说,for循环可以遍历Python中的任何可迭代对象。
  请看示例:
代码清单片段04
  在上述代码中,我们使用for循环遍历前面定义的列表。显而易见,我们没有手动使用next()函数,也没有获得任何StopIteration异常。这就是Python中for循环的美妙之处。它在幕后为我们处理所有这些。
  当然,我们可以自行这样来处理循环迭代。现在定义一个我们自己的for循环版本。我们将使用while循环并复制for循环的行为。在此,我们自己构建该实现所需的一切。如下所示:
代码清单片段-05
  在上述清单中,我们实现了自己版本的模拟for循环。代码中使用无限while循环:while True。在循环中设置了一个try-except块。在try块中,通过调用迭代器上的__next__()方法获得下一个元素。如果调用成功,则打印出该元素。如果发生了StopIteration类型的错误,则在except块中捕获该异常。在except块中所做的事情非常简单。我们只是跳出这个循环,这意味着我们已经到达迭代器的末端。
  小结
  本篇内容就写这些了,主要介绍了迭代器协议和和迭代器遍历。内容的文字不长,再结合代码能帮助你更好地理解和掌握这些Python编程知识点。

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar