type
status
date
slug
summary
tags
category
icon
password
一、面向对象编程(OOP)特性回顾
1.封装
将数据(属性)和对数据的操作(方法)组合在一起,对外暴露有限接口,隐藏内部实现细节。
2.继承
子类可以复用父类已有属性和方法,并可在此基础上扩展新功能。
3.方法覆盖(覆盖,Override)
子类中定义与父类同名方法,会“覆盖”父类的实现。
4.方法重写(重写,Overload)
同一方法名可在同一类中提供不同参数签名的多个版本。
二、可遍历对象(Iterable) 与 遍历器(Iterator)
1.可遍历对象(Iterable)
- 定义:只要一个对象实现了
__iter__()
方法,就称其为可遍历对象。
- 用途:可以使用
for … in …
、iter()
等对它进行遍历。
2.遍历器(Iterator)
- 定义:实现了
__next__()
方法的对象即为遍历器;同时,它自身也必须实现__iter__()
,并返回自身。
- 特性:每调用一次
__next__()
,返回下一个元素;遍历结束后抛出StopIteration
异常。
三、迭代器的实现方式
- 自定义类实现:如上例,通过实现
__iter__
和__next__
。
- 内置容器产生:Python 内置的
list、tuple、dict
等,只要调用iter()
就能获得对应的iterator
。
四、生成器(Generator)
生成器是 Python 提供的“简化版”迭代器,实现更为优雅:
1.生成器函数
- 在普通函数中使用
yield
关键字,即可变成生成器函数;每次遇到yield
,会“暂停”函数状态并返回对应值。
2.生成器表达式
- 类似于列表推导式,但外层使用圆括号,按需生成值,更节省内存。
五、结合业务:
在实际业务中,常需要对一批原始数据打标签或生成注释信息,可借助生成器逐条处理,并保持流水线化:
处理结果:


这样处理:
- 内存友好:不一次性加载所有数据;
- 可组合:后续还可再套一个过滤、再加工等生成器。
六、yield
在大文件处理 与 死循环处理中的应用
1.大文件分块读取
- 传统一次性读整文件会占用大量内存,可用生成器按行或按块读取:
2.死循环数据源
- 例如,持续监听消息队列或传感器数据:
七、模块化编程与模块概述
1.认识模块化编程:import
与 from … import …
- 使用模块化编程可将功能划分到不同文件中,提升代码可维护性与复用性。
- 基本语法:
- 示例:
2.认识模块:所有的 .py
文件都可看成模块
- 只要一个 Python 文件(如
utils.py
)在搜索路径中,就能通过import utils
加载它。
- 每个模块都有自己的名称空间(namespace),避免命名冲突。
- 模块加载时会执行文件顶层的所有语句,之后可通过模块对象访问其中的属性和方法。
3.模块分类
- 系统模块(标准库):Python 自带,无需额外安装,如
math
、os
、sys
、datetime
等。
- 第三方模块:社区或厂商开发,需通过
pip install
安装,如requests
、numpy
、pandas
等。
- 自定义模块:项目中自行编写的
.py
文件,按需组织在包(package)里。
4.熟悉常用的系统模块
math
:数学运算函数
os
:操作系统接口
os.path
:路径操作
- 其他常用标准库:
sys
(命令行参数、解释器信息)datetime
(日期与时间处理)json
(JSON 编解码)re
(正则表达式)
八、练习:把标注框信息归一化之后存到txt文本
1.代码:
2.运行结果:



3.代码编写过程中出现的错误
1.
size.find('width').text
获取到的数据为字符串类型,必须转化为可计算类型,强转为float
。2.
label = []
,label必须初始化在for循环前,不然会导致写入的文件中只有最后一个object的数据。3.使用
os.path.splitext(os.path.basename(p))[0]
,os.path.basename(p)
获取不含文件路径的文件名和扩展名, os.path.splitext()
拆分文件名和拓展名,os.path.splitext(os.path.basename(p))[0]
取文件名。这里也可以使用os.path.basename(p).split('.')[0]
,但是这个代码不够健壮,如果出现small.11.xml
,那么就会出现文件名不全的问题。4.使用
f.write(label)
出现问题,因为lable是列表类型,所以改用f.write('\n'.join(label))
成功添加。- 作者:sisui
- 链接:https://www.sisui.me//article/py-iterator-generator-differences
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章