Python 可迭代的对象与迭代器的对比

开发 后端
什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()函数,这是一个Python内置函数。

[[437056]]

什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()函数,这是一个Python内置函数。

可迭代的对象

iter()函数的作用如下:

如果对象实现了__iter__方法,那么就调用它,获取一个迭代器。比如:

  1. def __iter__(self): 
  2.  
  3. return SentenceIterator(self.words) 

如果对象没有实现__iter__但是实现了__getitem__方法,那么就创建一个迭代器,尝试从索引0开始获取元素。

如果尝试获取元素失败,就会抛出TypeError异常。

可迭代的对象,就是使用iter()函数判断,满足前面2点的对象。

任何Python序列都是可以迭代的,因为它们都实现了__getitem__方法。

迭代器

从前面iter()函数的作用可以发现,迭代器是从可迭代的对象中获取的。

如果对象本身是可迭代的,就调用__iter__方法获取一个迭代器。

如果对象不可迭代但是实现了__getitem__方法,那么就会创建一个迭代器。

比如可以使用iter()函数把列表转换为迭代器:

  1. >>> test_list = [1, 2, 3] 
  2. >>> print(type(test_list)) 
  3. <class 'list'
  4.  
  5. >>> test_iter = iter(test_list) 
  6. >>> print(type(test_iter)) 
  7. <class 'list_iterator'

迭代器可以使用for循环遍历:

  1. for x in test_iter: 
  2.  
  3. print(x) 

也可以使用while循环遍历:

  1. while True
  2.  
  3. try: 
  4.  
  5. print(next(test_iter)) 
  6.  
  7. except StopIteration: 
  8.  
  9. del test_iter 
  10.  
  11. break 
  • next()函数用于获取迭代器下一个元素。
  • 没有元素了,迭代器会抛出StopIteration异常。

标准的迭代器接口有两个方法:

  • __next__返回下一个元素。
  • __iter__返回self,以便在应该使用可迭代对象的地方使用迭代器,比如for循环中。
  1. def __iter__(self): 
  2.  
  3. return self 

迭代器的准确定义是:迭代器是这样的对象,它实现了无参数的__next__方法,返回序列中的下一个元素;如果没有元素了,那么抛出StopIteration异常。Python中的迭代器还实现了__iter__方法,因此迭代器也是可以迭代的。

最后,通过对比可以发现,可迭代对象的__iter__返回的是迭代器:

  1. def __iter__(self): 
  2.  
  3. return SentenceIterator(self.words) 

迭代器的__iter__返回的是self:

  1. class SentenceIterator: 
  2.  
  3. def __iter__(self): 
  4.  
  5. return self 

而且迭代器还需要有__next__方法。

从这一点就能清楚看出它们的区别了。

需要特别注意的是,可迭代的对象一定不能是自身的迭代器,也就是说,可迭代对象必须实现__iter__方法,但是不能实现__next__方法。否则会让设计模式变得混乱不堪。

参考资料:

《流畅的Python》第14章 可迭代的对象、迭代器和生成器

 

https://www.runoob.com/python3/python3-iterator-generator.html

 

责任编辑:武晓燕 来源: dongfanger
相关推荐

2022-10-26 08:25:06

Python编程迭代器

2020-11-24 08:00:22

JavaScript对象迭代器

2022-10-24 13:02:38

2017-06-26 16:26:15

Python迭代对象迭代器

2024-03-25 08:57:49

模块迭代对象迭代器

2016-03-28 10:39:05

Python迭代迭代器

2021-09-14 07:26:25

JavaScript迭代对象

2021-09-03 10:00:00

JavaScript迭代对象

2022-01-15 10:01:15

Javascript 高阶函数前端

2024-09-18 13:49:42

2022-10-26 09:27:59

Python编程迭代器协议

2010-07-20 13:56:26

Python迭代器生成器

2024-11-11 06:10:00

Python生成器迭代器

2018-05-28 09:20:10

Python迭代for循环

2013-08-19 16:44:15

.Net

2022-09-14 08:01:36

JoinMySQL迭代器

2009-12-15 14:58:19

Ruby迭代器

2011-07-13 13:56:06

STL迭代器

2024-05-10 11:31:59

Python迭代器生成器

2020-09-29 09:39:35

网络攻击
点赞
收藏

51CTO技术栈公众号