1. 可迭代对象:
1.1 基本概念:
可迭代对象是指可以通过
for...in...
这类循环语句遍历读取数据的对象。在Python中,可迭代对象是一个实现了__iter__()
方法或__getitem__()
方法的对象,它能够返回一个迭代器。
1.2 遍历(迭代)过程:
遍历(迭代)是指程序依次从可迭代对象中把一个个元素取出来的过程。
这个过程通常包括以下步骤:
- 调用可迭代对象的
__iter__()
方法获取迭代器对象- 重复调用迭代器的
__next__()
方法获取下一个元素- 直到捕获
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基本特征:
- 访问方式:通过调用next()方法逐个获取元素
- 状态保存:内部会记录当前的迭代位置
- 单向性:只能向前移动,不能后退或重新开始
- 终止机制:遍历完成后会抛出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 特点与优势:
- 内存高效:只在需要时生成值,不占用大量内存
- 惰性求值:按需计算,提高性能
- 无限序列:可以表示无限的数值序列
- 状态保持:每次
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注意事项:
- 生成器只能迭代一次
- 不能随机访问或索引
- 生成器表达式会立即求值外层表达式
- 要考虑异常处理和资源清理
4. Python中的可迭代对象、迭代器和生成器关系:
4.1 可迭代对象(Iterable)
可迭代对象是指实现了Python迭代协议(即
__iter__()
方法)的对象,可以通过for..in..
循环进行遍历。
常见的可迭代对象包括:
- 序列类型:
list
,tuple
,str
,bytes
,range
- 映射类型:
dict
- 集合类型:
set
,frozenset
- 文件对象:打开的文件对象
- 其他:迭代器对象、生成器对象
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 总结:
可迭代对象是最大的集合,包含所有可以迭代的对象
迭代器是特殊的可迭代对象,增加了状态记忆能力
生成器是最特殊的迭代器,提供了更简洁的实现方式