可迭代对象(Iterable)
在 Python 中,可迭代对象是实现了 __iter__()
方法或者包含 __getitem__()
方法(支持从索引 0 开始迭代)的对象。常见的可迭代对象包括列表、元组、字符串、字典、集合、文件对象等。
# 列表是一个可迭代对象
my_list = [1, 2, 3, 4]
迭代器(Iterator)
迭代器是实现了 __iter__()
和 __next__()
方法的对象。所有迭代器都是可迭代对象,但并非所有可迭代对象都是迭代器【列表是可迭代对象,但它并不是一个迭代器,不可直接使用next()调用】。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完,迭代器只能往前移动,不能后退。
列表被next()调用报错示例
以下代码直接使用next()函数调用my_list列表。
my_list = [1, 2, 3, 4]
print(next(my_list))
print(next(my_list))
print(next(my_list))
运行后报错:列表对象不是迭代器
Traceback (most recent call last):
File "C:\work\pythonBase\iterator.py", line 2, in <module>
print(next(my_list))
TypeError: 'list' object is not an iterator
iter() 函数
iter()
函数用于从一个可迭代对象中返回一个迭代器。对于实现了 __iter__()
方法的对象,iter()
调用该方法并返回迭代器;对于实现了 __getitem__()
方法的对象,iter()
创建一个从索引 0 开始访问元素的迭代器。
my_list = [1, 2, 3, 4]
my_iter = iter(my_list) # 获取迭代器
next() 函数
next()
函数用于从迭代器中获取下一个元素。当调用 next()
时,迭代器返回下一个值。如果迭代器已无更多元素,则引发 StopIteration
异常。
print(next(my_iter)) # 输出:1
print(next(my_iter)) # 输出:2
详细示例
下面是一个包含可迭代对象、迭代器、iter()
和 next()
函数的详细示例:
# 创建一个可迭代对象(列表)
my_list = [1, 2, 3, 4]
# 获取迭代器
my_iter = iter(my_list)
# 使用 next() 函数获取迭代器的下一个元素
print(next(my_iter)) # 输出:1
print(next(my_iter)) # 输出:2
print(next(my_iter)) # 输出:3
print(next(my_iter)) # 输出:4
# 尝试获取更多元素会引发 StopIteration 异常
try:
print(next(my_iter))
except StopIteration:
print("迭代器已无更多元素")
自定义迭代器
你可以通过定义一个类并实现 __iter__()
和 __next__()
方法来自定义迭代器:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# 使用自定义迭代器
my_iter = MyIterator([1, 2, 3, 4])
for item in my_iter:
print(item) # 输出:1 2 3 4
总结
- 可迭代对象:实现了
__iter__()
或__getitem__()
方法的对象,可以返回迭代器。 - 迭代器:实现了
__iter__()
和__next__()
方法的对象,可以逐一访问元素。 - iter() 函数:用于从可迭代对象中返回迭代器。
- next() 函数:用于从迭代器中获取下一个元素,如果无更多元素则引发
StopIteration
异常。