Python迭代器工具详解
目录
一、迭代器简介
在 Python 中,迭代器是一种可以逐个访问元素的对象,常用于遍历容器(如列表、元组、字典等)。
迭代器是Python中用于遍历数据结构的对象。例如:
# range生成的是迭代器
nums = range(5)
print(list(nums)) # [0, 1, 2, 3, 4]
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
print (next(it)) # 输出迭代器的下一个元素
1
print (next(it))
2
1.1 迭代器对象和可迭代对象
- 可迭代对象(Iterable):实现了 iter() 方法,返回一个迭代器。
- 迭代器(Iterator):实现了 next() 方法,每次调用都会返回下一个元素,当没有元素时抛出 StopIteration 异常。
迭代器对象一定是可迭代对象__iter__()方法要返回一个迭代器对象,你可以使用iter() 函数来触发它。
next()方法用于从迭代器中返回下一个值,如果没有可返回值了,抛出 StopIteration异常。你可以使用next() 函数来触发它。
例子:代码实现迭代器对象和可迭代对象
# 列表遍历
lst = [1, 2, 3]
for item in lst:
print(item) # 输出 1, 2, 3
# 使用迭代器遍历
it = iter(lst)
while True:
try:
print(next(it))
except StopIteration:
break
# 可迭代类
class MyIterable:
def __init__(self, data_list):
self.data_list = data_list # 存储数据
def __iter__(self):
return MyIterator(self) # __iter__方法要返回一个迭代器对象,且每次调用返回新的对象
# 迭代器类
class MyIterator:
def __init__(self, my_iterable):
self.my_iterable = my_iterable
self.index = 0 # 用于跟踪当前的位置
def __iter__(self):
return self # 一般迭代器类的__iter__方法都返回self,因为自己就是迭代器对象
def __next__(self):
if self.index >= len(self.my_iterable.data_list):
raise StopIteration # 如果没有更多元素,则抛出StopIteration异常
result = self.my_iterable.data_list[self.index]
self.index += 1
return result
#### 使用示例
my_list = [1, 2, 3, 4, 5]
# my_iterable是一个可迭代对象
my_iterable = MyIterable(my_list)
# my_Iterator是一个迭代器对象
# iter(Object)会执行 Object.__iter__(),返回一个迭代器对象
my_Iterator = iter(my_iterable)
# next(Object)会执行 Object.__next__(),返回下一个值
print(next(my_Iterator)) # 打印 1
print(next(my_Iterator)) # 打印 2
迭代器对象是有状态的,比如这里的index会一直增大。所以每次调用可迭代对象的__iter__(),都返回一个新的迭代器对象。
1.2 判断对象是否是可迭代对象或迭代器
我们可以使用 collections.abc 模块中的 Iterable 和 Iterator 类进行判断:
from collections.abc import Iterable, Iterator
# 列表是可迭代对象,但不是迭代器
lst = [1, 2, 3]
print(isinstance(lst, Iterable)) # True
print(isinstance(lst, Iterator)) # False
# 将列表转换为迭代器
it = iter(lst)
print(isinstance(it, Iterable)) # True
print(isinstance(it, Iterator)) # True
二、无限迭代器
count
生成无限递增序列(类似无终点range)
from itertools import count
# 示例:生成从0开始,步长为1的无限序列
for x in count(start=0, step=1):
if x > 5:
break
print(x, end=' ') # 0 1 2 3 4 5
cycle
循环遍历序列的无限迭代器
from itertools import cycle
# 示例:无限循环遍历字符串
cnt = 0
for c in cycle("HELLO"):
if cnt > 10:
break
print(c, end=' ') # H E L L O H E L L O H
cnt += 1
repeat
重复元素的无限迭代器
from itertools import repeat
# 示例1:无限重复
inf_repeat = repeat(10)
print(next(inf_repeat)) # 10
print(next(inf_repeat)) # 10
# 示例2:有限重复
lim_repeat = repeat(5, times=3)
print(list(lim_repeat)) # [5, 5, 5]
三、有限迭代器
accumulate
生成前缀计算值的迭代器
from itertools import accumulate
import operator
# 示例1:前缀和
data = [1, 2, 3, 4, 5]
print(list(accumulate(data))) # [1, 3, 6, 10, 15]
# 示例2:前缀乘积
print(list(accumulate([3,1,2,4], operator.mul))) # [3, 3, 6, 24]
# 示例3:前缀最大值
print(list(accumulate([3,1,4,2], max))) # [3, 3, 4, 4]
chain
合并多个迭代器
from itertools import chain
# 示例:合并两个字符串
combined = chain("ABC", "DEF")
print(list(combined)) # ['A', 'B', 'C', 'D', 'E', 'F']
四、排列组合迭代器
product
生成笛卡尔积
from itertools import product
# 示例1:二维笛卡尔积
cart = product([1,2], ['a','b'])
print(list(cart)) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
# 示例2:三维笛卡尔积
cart_3d = product([1,2], repeat=3)
print(list(cart_3d)[:3]) # [(1,1,1), (1,1,2), (1,2,1)]
permutations
生成排列(有序)
from itertools import permutations
# 示例1:全排列
full_perm = permutations([1,2,3])
print(list(full_perm))
# [(1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1)]
# 示例2:选2个排列
part_perm = permutations([1,2,3,4], 2)
print(list(part_perm)[:3]) # [(1,2), (1,3), (1,4)]
combinations
生成组合(无序)
from itertools import combinations
# 示例:选3个组合
combs = combinations([1,2,3,4], 3)
print(list(combs)) # [(1,2,3), (1,2,4), (1,3,4), (2,3,4)]
五、总结
- 迭代器是一种可以逐个访问元素的对象,提供了惰性计算和节省内存的优势。
- 使用 iter() 和 next() 可以将可迭代对象转换为迭代器。
- 自定义迭代器需要实现 iter() 和 next() 方法。
- 生成器是简洁版的迭代器,使用 yield 关键字。
- itertools 模块提供了强大的迭代工具,简化了迭代器操作。
提示:实际使用时需从
itertools模块导入相应函数:from itertools import count, cycle, repeat, accumulate, chain, product, permutations, combinations

1335

被折叠的 条评论
为什么被折叠?



