1. Iterable和Iterator是啥?
在开始解释Iterable和Iterator是什么之前,我们需要了解一下Python中的可迭代对象和迭代器。
可迭代对象是指实现了 __iter__() 方法的对象,该方法会返回一个可迭代器(Iterator)对象。实现 __iter__() 方法的对象都可以使用 for 循环进行遍历操作。
迭代器是指实现了 __iter__() 和 __next__() 方法的对象,__iter__() 方法返回迭代器对象自身,__next__() 方法返回下一个值,当没有值可返回时,会引发 StopIteration 异常。迭代器只能遍历一次,遍历结束后需要重新创建迭代器才能再次遍历。
class MyIterator:
def __init__(self, nums):
self.nums = nums
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.nums):
value = self.nums[self.index]
self.index += 1
return value
else:
raise StopIteration
nums = [1, 2, 3, 4]
it = MyIterator(nums)
for num in it:
print(num)
上述代码中,MyIterator 实现了 __iter__() 和 __next__() 方法,因此它是一个迭代器,可以使用 for 循环进行遍历操作。
但是,在实际编码中,我们很少直接定义迭代器类并使用它们,而是使用Python标准库中提供的迭代器实现,也就是Iterable和Iterator。
2. Iterable
Iterable是Python标准库中用于实现可迭代对象的抽象基类(abstract base class),意思是可以继承该类来实现自己的可迭代对象。
Iterable类定义了 __iter__() 方法,该方法返回一个迭代器,这个迭代器可以被用来遍历对象。
注意:Iterable本身并不是一个可迭代对象,只有实现了 __iter__() 方法的子类才是可迭代对象。
from collections.abc import Iterable
class MyList(Iterable):
def __init__(self, nums):
self.nums = nums
def __iter__(self):
return iter(self.nums)
nums = [1, 2, 3, 4]
my_list = MyList(nums)
for num in my_list:
print(num)
上述代码中,MyList 实现了 __iter__() 方法,并且继承了 Iterable 类,因此可以被用于 for 循环的遍历操作。
3. Iterator
Iterator是Python标准库中用于实现迭代器的抽象基类,意思是可以继承该类来实现自己的迭代器。
Iterator类定义了 __iter__() 和 __next__() 方法,__iter__() 方法返回迭代器对象自身,__next__() 方法返回下一个值,并在没有值可返回时引发 StopIteration 异常。
from collections.abc import Iterator
class MyIterable(Iterator):
def __init__(self, nums):
self.nums = nums
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.nums):
value = self.nums[self.index]
self.index += 1
return value
else:
raise StopIteration
nums = [1, 2, 3, 4]
my_iterable = MyIterable(nums)
for num in my_iterable:
print(num)
上述代码中,MyIterable 实现了 __iter__() 和 __next__() 方法,并且继承了 Iterator 类,因此可以被用于 for 循环的遍历操作。
4. Iterable和Iterator的区别
Iterable是实现了 __iter__() 方法的对象,返回的是一个迭代器,用于遍历对象,而Iterator是实现了 __iter__() 和 __next__() 方法的对象,用于实现特定的遍历功能。
换句话说,Iterable是“可迭代的”,相当于一个容器,Iterator是“迭代器”,相当于容器内的指针。
比如,列表是一个Iterable对象,可以遍历其中的值,而列表的迭代器是一个Iterator对象,可以实现更加灵活复杂的遍历方式。
另外,由于Iterator需要实现 __iter__() 方法,因此所有Iterator对象都是Iterable对象,但是反过来不成立。
5. 总结
Iterable和Iterator是Python中非常重要的概念,使用它们可以更加高效地实现遍历操作。在实际编码中,我们经常使用Python标准库中提供的Iterable和Iterator类型,例如列表、元组、字典、文件等等。
需要注意的是,在使用可迭代对象和迭代器时需要注意遍历的顺序和次数,每个迭代器只能使用一次,遍历结束后需要重新创建新的迭代器才能再次遍历。