1、迭代器
定义:迭代器是python最强大的功能之一,是访问集合元素的一种方式。实现__iter__和__next__方法的对象,是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
内存占用:需要显式管理数据
实现复杂度:需手动编写类
复用性:可多次迭代
核心作用:
提供统一的遍历接口(for循环、next())
支持大规模数据流处理(如逐行读取文件)
基本用法 创建一个迭代器:
python的构造函数为 init(),它会在对象初始化的时候执行。
把一个类作为一个迭代器使用需要在类中实现两个方法 iter()与 next()。
Stoplteration异常用于标识迭代的完成,防止出现无限循环的情况,在 next()方法中我们可以设置在完成指定循环次数后触发Stoplteration异常来结束迭代。
# 自定义迭代器类class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return self# 返回迭代器对象自身def __next__(self):if self.current<= 0:raise StopIteration# 终止迭代num = self.currentself.current -= 1return num# 使用迭代器counter = CountDown(3)for num in counter:print(num) # 输出 3, 2, 1
内置迭代工具:
iter():创建迭代器,将可迭代对象(如列表)转换为迭代器
字符串、列表或元组对象都可以用于创建迭代器:
>>>list=[1,2,3,4]>>>it = iter(list) # 创建迭代器对象>>>print (next(it)) # 输出迭代器的下一个元素1>>>print (next(it))2
迭代器对象可以使用常规for语句进行遍历:
#!/usr/bin/python3list=[1,2,3,4]it = iter(list) # 创建迭代器对象for x in it:print (x, end=" ")
next():依次输出迭代对象元素下一个值
也可以使用next()函数:
#!/usr/bin/python3import sys# 引入 sys 模块list=[1,2,3,4]it = iter(list) # 创建迭代器对象while True:try:print (next(it))except StopIteration:sys.exit()
2、生成器
定义:使用yield关键字定义的函数或表达式被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器也是一个迭代器。在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置接着继续运行。调用一个生成器函数,返回的是一个迭代器对象。
内存占用:惰性计算,按需生成值,节省内存
实现复杂度:通过yield自动实现,代码更简洁
复用性:只能迭代一次(生成器耗尽后无法重复使用)
核心作用:
基本用法:
生成器函数(使用 yield)使用yiled实现斐波那契数列:
#!/usr/bin/python3import sysdef fibonacci(n): # 生成器函数 - 斐波那契a, b, counter = 0, 1, 0while True:if (counter>n): returnyield aa, b = b, a+bcounter += 1f = fibonacci(10) # f 是一个迭代器,由生成器返回生成while True:try:print (next(f), end=" ")except StopIteration:sys.exit()
生成器表达式,类似列表推导,但用()包裹:
gen = (x*2 for x in range(3))print(next(gen)) # 0print(next(gen)) # 2
send()方法,向生成器发生数据【yiled from委托子生成器】
def generator_with_send():value = 0while True:received = yield value# 接收外部传入的值if received is not None:value = receivedelse:value += 1gen = generator_with_send()print(next(gen)) # 0print(gen.send(10)) # 10(修改内部状态)print(next(gen)) # 11
经典应用场景
1、处理大规模数据
def read_large_file(file_path):with open(file_path, 'r') as f:for line in f: # 逐行读取,避免内存爆炸yield line.strip()for line in read_large_file('huge_log.txt'):process(line) # 逐行处理,写处理逻辑2、无限序列
def infinite_sequence():num = 0while True:yield numnum += 1gen = infinite_sequence()print(next(gen)) # 0print(next(gen)) # 1
3、协程(Coroutine)
利用生成器实现轻量级并发:
def coroutine():while True:x = yield# 等待接收值print(f"Received: {x}")c = coroutine()next(c) # 启动协程c.send(10) # 输出 "Received: 10"c.send("Hi") # 输出 "Received: Hi"总结
迭代器:提供通用遍历接口,需手动实现__next__
生成器:通过yield简化迭代器创建,节省内存,适合流式数据处理,但是会降低运行的速度
生成器是“一次性的”,遍历结束后需重新创建:
gen = (x for x in range(3))list(gen) # [0, 1, 2]list(gen) # [](已耗尽)
迭代器:立即生成所有数据,方便随机访问
核心选择:需要复用数据时用迭代器,处理大规模或无限数据时优先选生成器
3、装饰器[函数章节]
装饰器是一种设计模式,用于在不修改函数代码的情况下扩展函数的功能,起到补充原函数功能的作用,用@表示。
以下示例:
def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decoratordef say_hello():print("Hello!")say_hello()@my_decorator构造装饰器,将say_hello()的函数作为my_decorator()的参数在其中间执行出来。