Python基础教学-可迭代的(Iterable)和迭代器(iterator)的区别-由Deepseek产生
在Python中,"可迭代的"和"迭代器"是两个密切相关但不同的概念:
可迭代的 (Iterable)
- 定义:任何可以返回迭代器的对象
- 特点:实现了
__iter__()方法 - 示例:列表、元组、字符串、字典、集合等
- 使用:可以用在
for循环中
# 可迭代对象示例
my_list = [1, 2, 3] # 列表
my_string = "hello" # 字符串
my_dict = {'a': 1, 'b': 2} # 字典# 都可以用在for循环中
for item in my_list:print(item)
迭代器 (Iterator)
- 定义:实现了迭代器协议的对象
- 特点:实现了
__iter__()和__next__()方法 - 行为:记住遍历的位置,可以通过
next()逐个获取元素 - 状态:有状态的,会消耗元素
# 获取迭代器
my_list = [1, 2, 3]
iterator = iter(my_list) # 或者 my_list.__iter__()print(next(iterator)) # 输出: 1
print(next(iterator)) # 输出: 2
print(next(iterator)) # 输出: 3
# print(next(iterator)) # 抛出 StopIteration 异常
关键区别
| 特性 | 可迭代的 | 迭代器 |
|---|---|---|
| 实现方法 | __iter__() | __iter__() 和 __next__() |
| 状态 | 无状态 | 有状态,记住位置 |
| 元素消耗 | 不消耗元素 | 消耗元素 |
| 多次遍历 | 可以多次遍历 | 只能遍历一次 |
实际例子
# 自定义可迭代对象
class MyRange:def __init__(self, start, end):self.start = startself.end = enddef __iter__(self):return MyRangeIterator(self.start, self.end)# 自定义迭代器
class MyRangeIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current >= self.end:raise StopIterationvalue = self.currentself.current += 1return value# 使用
my_range = MyRange(1, 4) # 可迭代对象
for num in my_range:print(num) # 输出: 1, 2, 3# 再次遍历会重新开始
for num in my_range:print(num) # 输出: 1, 2, 3
简化版本
更简单的方式是让同一个类同时实现可迭代和迭代器:
class SimpleRange:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current >= self.end:raise StopIterationvalue = self.currentself.current += 1return value# 但注意:这个只能遍历一次!
simple_range = SimpleRange(1, 4)
for num in simple_range:print(num) # 输出: 1, 2, 3# 再次遍历不会输出任何内容,因为迭代器已耗尽
for num in simple_range:print(num) # 无输出
总结
- 可迭代的:可以获取迭代器的对象
- 迭代器:实际执行迭代的对象
- 所有迭代器都是可迭代的,但并非所有可迭代对象都是迭代器
for循环内部会自动处理迭代器的创建和StopIteration异常
