【蓝桥杯7天速成】第十九章:Python迭代器工具详解

Python迭代器工具详解

目录

  1. 迭代器简介
  2. 无限迭代器
  3. 有限迭代器
  4. 排列组合迭代器

一、迭代器简介

在 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

monday_CN

72小时打磨,值得1元认可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值