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.生成器表达式

  • 类似于列表推导式,但外层使用圆括号,按需生成值,更节省内存。

五、结合业务:

在实际业务中,常需要对一批原始数据打标签或生成注释信息,可借助生成器逐条处理,并保持流水线化:
处理结果:
notion image
notion image
这样处理:
  • 内存友好:不一次性加载所有数据;
  • 可组合:后续还可再套一个过滤、再加工等生成器。

六、yield 在大文件处理 与 死循环处理中的应用

1.大文件分块读取

  • 传统一次性读整文件会占用大量内存,可用生成器按行或按块读取:

2.死循环数据源

  • 例如,持续监听消息队列或传感器数据:

七、模块化编程与模块概述

1.认识模块化编程:importfrom … import …

  • 使用模块化编程可将功能划分到不同文件中,提升代码可维护性与复用性。
  • 基本语法:
    • 示例:

      2.认识模块:所有的 .py 文件都可看成模块

      • 只要一个 Python 文件(如 utils.py)在搜索路径中,就能通过 import utils 加载它。
      • 每个模块都有自己的名称空间(namespace),避免命名冲突。
      • 模块加载时会执行文件顶层的所有语句,之后可通过模块对象访问其中的属性和方法。

      3.模块分类

      • 系统模块(标准库):Python 自带,无需额外安装,如 mathossysdatetime 等。
      • 第三方模块:社区或厂商开发,需通过 pip install 安装,如 requestsnumpypandas 等。
      • 自定义模块:项目中自行编写的 .py 文件,按需组织在包(package)里。

      4.熟悉常用的系统模块

      • math:数学运算函数
        • os:操作系统接口
          • os.path:路径操作
            • 其他常用标准库:
              • sys(命令行参数、解释器信息)
              • datetime(日期与时间处理)
              • json(JSON 编解码)
              • re(正则表达式)

            八、练习:把标注框信息归一化之后存到txt文本

            1.代码:

            2.运行结果:

            notion image
            notion image
            notion image

            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))成功添加。
             
            6.py-类和对象的基本概念及属性和方法的常见分类和使用场景8.py-模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
            Loading...