附代码 什么是Python的迭代器和生成器?

作者:Aniruddha Bhandari
翻译:王琦
校对:和中华
本文约3700字 , 建议阅读10分钟 。
本文介绍了Python中的生成器和迭代器 。在处理大量数据时 , 计算机内存可能不足 , 我们可以通过生成器和迭代器来解决该问题 。
迭代器:一次一个!Python 是一种美丽的编程语言 。我喜欢它提供的灵活性和难以置信的功能 。我喜欢深入研究Python的各种细微差别 , 并了解它如何应对不同的情况 。
在使用Python的过程中 , 我了解到了一些功能 , 这些功能的使用与其简化的复杂度不相称 。我喜欢称它们为Python中“隐藏的宝石” 。很多人对此并不了解 , 但对于分析和数据科学专家来说 , 它们非常有用 。
Python迭代器和生成器正好属于这一类 。它们的潜力是巨大的!

附代码 什么是Python的迭代器和生成器?

文章插图
 
如果你曾经在处理大量数据时遇到麻烦(谁没有呢?!) , 并且计算机内存不足 , 那么你会喜欢Python中的迭代器和生成器的概念 。
与其将所有数据一次性都放入内存中 , 不如将它按块处理 , 只处理当时所需的数据 , 对吗?这将大大减少我们计算机内存的负载 。这就是迭代器和生成器的作用!
因此 , 让我们仔细读读本文 , 探索Python迭代器和生成器的世界吧 。
我假设你熟悉Python的基础知识 。如果没有 , 我建议你先从下面的热门课程学起:
Python数据科学:
https://courses.analyticsvidhya.com/courses/introduction-to-data-science?utm_source=blog&utm_medium=python-iterators-and-generators
这是我们要介绍的内容:
  • 什么是可迭代对象?
  • 什么是Python迭代器?
  • 在Python中创建一个迭代器
  • 熟悉Python中的生成器
  • 实现Python中的生成器表达式
  • 为什么你应该使用迭代器?
什么是可迭代对象?“可迭代对象是能够一次返回其一个成员的对象” 。
通常使用for循环完成此操作 。像列表、元组、集合、字典、字符串等等之类的对象被称为可迭代对象 。简而言之 , 任何你可以循环的对象都是可迭代对象 。
我们可以使用for循环逐个地返回可迭代的元素 。在这里 , 我们使用for循环遍历列表的元素:
# iterables  sample = ['data science', 'business analytics', 'machine learning']  for i in sample:      print(i)
附代码 什么是Python的迭代器和生成器?

文章插图
 
既然我们知道了什么是可迭代对象 , 那么实际上我们是如何遍历这些值的?以及我们的循环如何知道何时停止?进入到迭代器部分!
什么是Python迭代器?迭代器是代表数据流的对象 , 即可迭代 。它们在Python中实现了迭代器协议 。这是什么?
好吧 , 迭代器协议允许我们在一个可迭代对象中使用两种方法来循环遍历项:__iter __()和__next __() 。所有的可迭代对象和迭代器都有__iter __()方法 , 该方法返回一个迭代器 。
迭代器跟踪可迭代对象的当前状态 。
但可迭代对象和迭代器不同之处在于__next __()方法只能由迭代器访问 。这使得无论何时只要我们要求迭代器返回下一个值 , 迭代器就会返回下一个值 。
让我们创建一个简单的可迭代对象、本例中为一个列表以及使用__iter __()方法来构造一个迭代器来了解其工作原理:
sample = ['data science', 'business analytics', 'machine learning']  # generating an iterator  it = sample.__iter__()  print(it)  # iterables do not have __next__() method  sample.__next__()  
附代码 什么是Python的迭代器和生成器?

文章插图
 
是的 , 正如我所说 , 可迭代对象有用于创建迭代器的__iter __()方法 , 但它们没有仅迭代器才有的__next __()方法 。因此 , 让我们再试一次 , 然后尝试从列表中检索值:
sample = ['data science', 'business analytics', 'machine learning']  # generating an iterator  it = sample.__iter__()  print(it.__next__())  print(it.__next__())  print(it.__next__()) 


推荐阅读