Python学习-迭代器、生成器

张开发
2026/4/13 14:51:14 15 分钟阅读

分享文章

Python学习-迭代器、生成器
Python学习-迭代器、生成器Python迭代器基础概念规则示例Python生成器创建生成器的方式property属性定义方式正则表达式步骤常用的元字符、预定义字符Python迭代器是 Python 中处理可循环数据的核心机制是一种可以记住遍历位置的对象能逐个取出数据而不是一次性把所有数据加载到内存非常高效。基础概念可迭代对象Iterable可以被 for 循环遍历的对象比如列表、字符串、元组、字典、集合、生成器等。本质内部实现了__iter__()方法。迭代器Iterator可迭代对象的 “迭代助手”专门负责逐个取出元素、记录遍历位置。本质同时实现了__iter__()和__next__()方法。迭代Iteration从迭代器中逐个取出元素的过程即 for 循环在做的事。规则Python 规定一个对象要成为迭代器必须实现两个方法__iter__()返回迭代器对象本身__next__()返回下一个元素没有元素时抛出 StopIteration 异常示例将可迭代对象转成迭代器Python 内置函数iter()可以直接把列表、字符串等变成迭代器。用next()可以手动取出下一个元素。# 1. 一个普通列表可迭代对象lst[10,20,30]# 2. 转换成迭代器ititer(lst)# 3. 逐个取值print(next(it))# 10print(next(it))# 20print(next(it))# 30# 4. 取完了再调用会抛出 StopIteration# print(next(it)) # 报错注意迭代器只能往前不能后退取完所有元素后就 “耗尽” 了不能重复使用for 循环本质就是自动调用iter()和next()并捕获结束异常手动自定义一个迭代器classCounter:def__init__(self,max_num):self.maxmax_num self.count0# 记录当前位置# 必须实现返回迭代器自己def__iter__(self):returnself# 必须实现返回下一个值def__next__(self):self.count1ifself.countself.max:raiseStopIteration# 抛出异常迭代结束returnself.count# 使用自定义迭代器counterCounter(5)fornumincounter:print(num)Python生成器是 Python 中一种自带迭代器协议、支持惰性计算的特殊对象本质是简化版的迭代器不用手动写类和__iter__/__next__通过函数 yield 关键字就能实现执行时可暂停并恢复只在需要时才产生数据极大节省内存适合大数据与流式处理。创建生成器的方式生成器推导式 创建生成器 括号()代表是生成器而不是一个元组 括号()里面是数据的生成规则返回一个对象 my_gen(x*2forxinrange(5))print(my_gen)# 从生成器中获取数据# 1. next()print(next(my_gen))# 0print(next(my_gen))# 2# 2. 遍历生成器forvalueinmy_gen:print(value)# 4,6,8对比列表 vs 生成器# 1. 列表一次性创建 1 亿个数字内存直接爆满# 列表推导式big_list[xforxinrange(100000000)]# 2. 生成器只保存生成规则不保存数据内存占用几乎为 0# 生成器推导式big_gen(xforxinrange(100000000))yield 关键字def 函数里把return换成yield就是生成器函数。# 生成器函数产生 1~5 的数字defmy_generator():foriinrange(1,10):yieldi# 创建生成器对象不会执行任何代码gmy_generator()# 每次 next()执行到 yield 就暂停返回值print(next(g))# 1print(next(g))# 2print(next(g))# 3执行规则调用函数 g my_generator() → 只创建生成器对象不执行代码next(g) → 从函数开头执行遇到 yield 暂停返回值再次 next(g) → 从暂停位置继续执行直到下一个 yield函数结束 → 自动抛出 StopIterationproperty属性是 Python 内置的一种装饰器用来把类里的方法伪装成普通属性让你可以像访问属性 obj.attr 一样调用方法。可以隐藏内部实现对外保持简洁接口。定义方式property 装饰器方式property 装饰 获取值的函数被装饰后的函数名.setter 装饰 修改值的函数classPerson:def__init__(self,age):self._ageage# 约定私有变量# 把方法变成“可读属性”提供公共的访问接口propertydefage(self):returnself._age# 定义赋值行为age.setterdefage(self,value):ifnotisinstance(value,int):raiseValueError(年龄必须是整数)ifvalue0orvalue150:raiseValueError(年龄不合法)self._agevalue# 定义删除行为可选age.deleterdefage(self):delself._age pPerson(20)print(p.age)# 自动调用 property 方法p.age25# 自动调用 age.setterdelp.age# 自动调用 age.deleter传统写法类属性方法-property() 函数类属性名 property(获取值方法名, 设置值方法名, …) → 括号里的顺序不能改classPerson:def__init__(self,age):self._ageagedefget_age(self):returnself._agedefset_age(self,value):self._agevaluedefdel_age(self):delself._age# 参数顺序getter, setter, deleter, docageproperty(get_age,set_age,del_age)pPerson(18)p.age20print(p.age)正则表达式是 Python 处理字符串匹配、查找、替换、验证最强大的工具即用来描述字符串规则的公式。使用内置的标准库re。步骤导入 re 模块import re定义正则规则编写匹配模式字符串建议前面加 r 表示原始字符串避免转义问题。选择匹配方法校验格式re.match() / re.fullmatch()→ 从开头匹配查找第一个结果re.search()→ 查找任意位置第一个匹配提取所有结果re.findall()最常用→ 找出所有匹配返回列表最常用替换内容re.sub(pattern, repl, string)→ 替换字符串执行匹配 / 提取 / 替换获取处理结果示例importre tel13812345678# res re.match(正则规则, 要校验的字符串)resre.match(r^1[3-9]\d{9}$,tel)print(res)# 匹配成功print(res.group()ifreselse匹配失败)常用的元字符、预定义字符元字符符号含义.匹配任意一个字符除换行[]字符集合匹配括号里任意一个[^]不匹配括号里的字符*匹配前一个字符 0 次或多次匹配前一个字符 1 次或多次?匹配前一个字符 0 次或 1 次{n}精确匹配 n 次{n,m}匹配 n~m 次可包含n,m次^匹配字符串开头$匹配字符串结尾|表示或匹配左右任意一个表达式()将括号中的字符作为一个分组提取内容\num引用分组中第num组匹配到的字符串预定义字符符号含义\d匹配数字 0-9\D匹配非数字\w匹配非特殊字符即字母、数字、下划线、汉字等\W匹配特殊字符即非字母、数字、下划线、汉字等\s匹配空白即空格、换行、制表\S匹配非空白示例importre# 原始字符串text姓名小明年龄18班级初三1班# 正则用 () 把要提取的内容包起来resultre.match(r姓名(\w)年龄(\d),text)print(result.group())print(result.group(0))# 效果同上print(姓名:,result.group(1))print(年龄:,result.group(2))

更多文章