python Iterable和Iterator

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类型,例如列表、元组、字典、文件等等。

需要注意的是,在使用可迭代对象和迭代器时需要注意遍历的顺序和次数,每个迭代器只能使用一次,遍历结束后需要重新创建新的迭代器才能再次遍历。

后端开发标签