[python篇]迭代器,生成器及property属性用法
一.迭代器
1.1 定义
迭代:依次从容器中取出元素的过程,就是迭代。
可迭代对象 (Iterable):能被 for 循环遍历的对象。
迭代器 (Iterator):一个能记住遍历位置的对象,专门用来依次取出可迭代对象的元素。
如何区分可迭代对象和迭代器
可迭代对象 (Iterable):实现
__iter__()方法迭代器 (Iterator):同时实现
__iter__()和__next__()方法
1.2 迭代器协议
1.__iter__(self)
返回迭代器对象本身。这样迭代器本身也是可迭代的,可以被 for 循环接受。
2.__next__(self)
返回容器的下一个元素。如果已经没有元素,必须抛出 StopIteration 异常,告诉 for 循环停止。
1.3 手动迭代与自动调用迭代
iter(可迭代对象):获取对象的迭代器
next(迭代器):获取迭代器的下一个元素
1.3.1 手动迭代(附示例)
list = [1, 2, 3]
it = iter(list)
print(next(it))
print(next(it))
print(next(it))
结果:

1.3.2 主动调用迭代(附示例)
it = iter([1,2,3])
while True:
try:
num = next(it)
print(num)
except StopIteration:
break
结果:

1.4 迭代器的核心优点
1.节省内存:不需要一次性把所有数据加载到内存。
2.惰性计算:只在需要时才生成下一个值,适合处理无限序列。
3. 统一接口:所有可迭代对象都能用迭代器遍历,代码更通用。
二.生成器
2.1 定义
生成器是一种特殊的迭代器,它不一次性计算并存储所有结果,而是在每次被请求时,才计算并返回下一个值。
2.2 作用
1.极致的节省内存 —— 按需生产
2.处理无法存储的无限流 —— 延迟计算
3.提升程序响应速度
2.3 用法
2.3.1 推导式(示例)
推导式是一种从一个可迭代对象快速构建另一个可迭代对象的简洁语法。
列表推导式:
list_squares = [x**2 for x in range(1, 11)]
print(f"列表推导式结果: {list_squares}")
print(f"列表推导式类型: {type(list_squares)}")
print()
生成器推导式:
gen_squares = (x**2 for x in range(1, 11))
print(f"生成器推导式对象: {gen_squares}")
print(f"生成器推导式类型: {type(gen_squares)}")
print()
逐个取出生成器的值:
print("逐个取出生成器的值:")
print(next(gen_squares))
print(next(gen_squares))
print(next(gen_squares))
结果:

2.3.1 yield关键字
def count_up_to(n):
num = 1
while num <= n:
print(f"生成器内部:准备给出 {num}")
yield num
num += 1
print("生成器内部:继续执行下一轮循环")
把值存储(挂起状态,存储不严谨)到生成器中
当前 num = 1
下一条要执行的指令是 while 循环中的 yield num
gen = count_up_to(3)
创建生成器对象
print(next(gen))
print("主程序做点别的事...")
print(next(gen))
count_up_to(n) 被调用时,立即返回生成器对象,而不是立即执行函数体。
普通函数(return)VS生成器(yield):
| 特征 | 普通函数 (return) | 生成器函数 (yield) |
| 返回值次数 | 只能一次 | 可以多次 |
| 状态保持 | 调用结束,局部变量销毁 | 暂停时,局部变量保留 |
| 执行方式 | 一次性跑完 | 跑一段,暂停,再跑一段 |
| 调用结果 | 得到具体的数据对象 | 得到一个生成器对象 |
2.4 迭代器VS生成器
| 概念 | 定义 | 如何创建 | 核心方法 |
| 迭代器 | 一个实现了 __iter__() 和 __next__() 方法的对象 | 实现类,或调用 iter(obj) | 手动维护状态变量 |
| 生成器 | 一种特殊的迭代器,由包含 yield 的函数或表达式自动生成 | yield 函数 / (...) 表达式 | Python 自动维护状态 |
三.property属性
作用:方法调用属性化
3.1 装饰器用法(附示例)
@property 修饰 获取值的函数 @获取值的函数名.setter 修饰 设置值的函数
class Student:
def __init__(self):
self._age = 18
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if 0 <= age <= 120:
self._age = age
else:
raise ValueError("年龄必须在 0 ~ 120 之间!")
if __name__ == '__main__':
s = Student()
print("初始年龄:", s.age)
s.age = 20
print("修改后年龄:", s.age)
结果:

3.2 类属性用法(附示例)
类属性属性名 = property(获取值的函数名,设置值的函数名)
class Student:
def __init__(self):
self._age = 18
def get_age(self):
return self._age
def set_age(self,age):
self._age = age
age = property(get_age,set_age)
if __name__ == '__main__':
s = Student()
s.age = 99
print(s.age)
结果:

更多推荐

所有评论(0)