Python可迭代对象、迭代器与生成器

 1. 可迭代对象:

1.1 基本概念:

        可迭代对象是指可以通过for...in...这类循环语句遍历读取数据的对象。在Python中,可迭代对象是一个实现了__iter__()方法或__getitem__()方法的对象,它能够返回一个迭代器。

1.2 遍历(迭代)过程:

遍历(迭代)是指程序依次从可迭代对象中把一个个元素取出来的过程。

这个过程通常包括以下步骤:

  1. 调用可迭代对象的__iter__()方法获取迭代器对象
  2. 重复调用迭代器的__next__()方法获取下一个元素
  3. 直到捕获StopIteration异常,表示迭代结束

person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
    print(f"Key: {key}, Value: {person[key]}")

1.3 自定义可迭代对象:

开发者也可以通过实现__iter__()方法来创建自定义的可迭代对象:

class CountDown:
    def __init__(self, start):
        self.start = start
        
    def __iter__(self):
        current = self.start
        while current > 0:
            yield current
            current -= 1

for num in CountDown(5):
    print(num)

1.4 注意:

  • 可迭代对象不同于迭代器,前者可以多次遍历,后者通常只能遍历一次
  • 某些可迭代对象(如生成器)是惰性求值的,只有在迭代时才会计算值
  • 大型数据集使用可迭代对象可以节省内存,因为不需要一次性加载所有数据
with open('data.txt') as file:
    for line in file:
        print(line.strip())

字典操作:遍历字典的键、值或键值对

numbers = [1, 2, 3, 4, 5]
for num in numbers:
    print(num * 2)

文件读取:逐行读取文件内容

with open('data.txt') as file:
    for line in file:
        print(line.strip())
 

数据处理:遍历列表中的数据进行计算或处理

person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
    print(f"Key: {key}, Value: {person[key]}")
 

1.6 Python中的常见可迭代对象包括:

  • 序列类型:列表(list)、元组(tuple)、字符串(str)
  • 非序列类型:字典(dict)、集合(set)、文件对象
  • 生成器(generator)和生成器

2. 迭代器:

2.1含义:

        迭代器是一种设计模式,它提供了一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,通过调用__next__()方法逐个访问元素,直到所有元素被访问完毕。迭代器的特点是只能单向前进,不能后退或重置。

2.2基本特征:

  1. 访问方式:通过调用next()方法逐个获取元素
  2. 状态保存:内部会记录当前的迭代位置
  3. 单向性:只能向前移动,不能后退或重新开始
  4. 终止机制:遍历完成后会抛出StopIteration异常

2.3 实现方式:

在Python中,迭代器需要实现两个特殊方法:

  • iter(): 返回迭代器对象本身
  • next(): 返回下一个元素

2.4 示例:

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):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# 使用示例
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
    print(item)  # 输出:1 2 3

优点:

  • 统一的访问接口
  • 支持惰性求值
  • 节省内存资源
  • 适用于无限序列

2.5 注意事项:

  • 迭代器是一次性的,遍历完成后需要重新创建
  • 不能随机访问元素
  • 无法预知剩余元素数量

3. 生成器:

3.1概念与定义:

生成器(Generator)是一种特殊的迭代器,它允许你在需要时才生成值,而不是一次性生成所有值。这种特性使得生成器在处理大量数据或无限序列时特别高效。

3.2 基本语法:

在Python中,生成器可以通过两种方式创建:

生成器函数:使用yield关键字代替return的函数

def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

生成器表达式:类似列表推导式,但使用圆括号

squares = (x*x for x in range(10))

3.3 特点与优势:

  1. 内存高效:只在需要时生成值,不占用大量内存
  2. 惰性求值:按需计算,提高性能
  3. 无限序列:可以表示无限的数值序列
  4. 状态保持:每次yield后保持函数状态

大数据处理:处理大型文件或数据集

def read_large_file(file_path):
    with open(file_path) as f:
        for line in f:
            yield line

流处理:实时数据处理管道

数学序列:斐波那契数列等

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

协程:实现轻量级多任务处理

3.4 高级用法:

send()方法:向生成器发送数据

throw()方法:向生成器抛出异常

close()方法:终止生成器

协程装饰器:简化协程初始化

def accumulator():
    total = 0
    while True:
        value = yield total
        if value is None: break
        total += value

3.5注意事项:

  1. 生成器只能迭代一次
  2. 不能随机访问或索引
  3. 生成器表达式会立即求值外层表达式
  4. 要考虑异常处理和资源清理

4. Python中的可迭代对象、迭代器和生成器关系:

4.1 可迭代对象(Iterable)

可迭代对象是指实现了Python迭代协议(即__iter__()方法)的对象,可以通过for..in..循环进行遍历。

常见的可迭代对象包括:

  1. 序列类型list, tuple, str, bytes, range
  2. 映射类型dict
  3. 集合类型set, frozenset
  4. 文件对象:打开的文件对象
  5. 其他:迭代器对象、生成器对象

4.2 迭代器(Iterator)

迭代器是可迭代对象的子集,它除了实现__iter__()方法外,还必须实现__next__()方法。

迭代器的主要特点:

  • 状态记忆:能够记住当前的遍历位置
  • 单向性:只能向前移动,不能后退或重置
  • 有限性:遍历完毕后会抛出StopIteration异常
  • 惰性计算:每次只产生一个值,节省内存

创建迭代器的方法:

# 通过iter()函数转换可迭代对象
my_list = [1, 2, 3]
iter_obj = iter(my_list)

print(next(iter_obj))  # 1
print(next(iter_obj))  # 2
print(next(iter_obj))  # 3
print(next(iter_obj))  # 抛出StopIteration
 

4.3 生成器(Generator)

生成器是特殊的迭代器,Python提供两种创建生成器的方式:

生成器函数:

使用yield关键字代替return的函数:

def count_down(n):
    while n > 0:
        yield n
        n -= 1

# 使用示例
for i in count_down(5):
    print(i)  # 输出5,4,3,2,1

生成器表达式:

类似列表推导式的语法:

gen = (x**2 for x in range(5))
print(next(gen))  # 0
print(next(gen))  # 1

生成器的优势在于:

  • 内存高效:不需要一次性生成所有元素
  • 延迟计算:只在需要时才计算值
  • 无限序列:可以表示无限的数据流

判断一个对象是否是可迭代对象可以使用isinstance(obj, Iterable)方法:

from collections.abc import Iterable

print(isinstance([1,2,3], Iterable))  # True
print(isinstance("hello", Iterable))  # True
print(isinstance(123, Iterable))      # False

4.4 三者的包含关系

可以用数学集合表示三者关系:可迭代对象 ⊃ 迭代器 ⊃ 生成器

4.5 总结:

可迭代对象是最大的集合,包含所有可以迭代的对象

迭代器是特殊的可迭代对象,增加了状态记忆能力

生成器是最特殊的迭代器,提供了更简洁的实现方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值