2026-03-10
Python
00

Python 实现多线程主要靠 threading 模块。最常用的两种方式:一是直接给 threading.Thread 传一个 target 函数,二是继承 Thread 类然后重写 run 方法。

Python
import threading import time def print_numbers(): for i in range(5): print(f'Number: {i}') time.sleep(1) def print_letters(): for letter in 'abcde': print(f'Letter: {letter}') time.sleep(1) # 创建线程 thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # 启动线程 thread1.start() thread2.start() # 等待线程结束 thread1.join() thread2.join() print('Done.')

上面这段代码创建了两个线程分别跑 print_numbers 和 print_letters。调用 start() 让线程开始执行,join() 则是让主线程等着子线程跑完再继续往下走。

线程的生命周期大致是:创建线程对象 → 调用 start() 进入就绪状态 → 获取 CPU 时间片开始执行 → 执行完毕或遇到 join() 等待 → 线程结束

2026-03-10
Python
00

核心思路就是分而治之,不要把整个文件一股脑儿塞进内存,而是一点一点地读、一点一点地处理。

Python 提供了两种主流方案:逐行读取分块读取

  • 逐行读取适合文本文件,每次只在内存里放一行数据
  • 分块读取适合二进制文件或需要固定大小处理的场景,每次读指定字节数。

两种方式都能把 8G 文件的内存占用压到几 KB 到几 MB 级别。

2026-03-10
Python
00

Python 的继承就是让一个类直接拿到另一个类的属性和方法,不用重复写一遍。子类继承父类之后,父类有的东西子类全都能用,想改就重写对应的方法就行。

Python 跟 Java 不一样的地方在于它支持 多继承,一个子类可以同时继承多个父类。多继承虽然灵活,但也带来了方法冲突的问题,Python 用 MRO 来确定方法调用顺序。来看个最直观的例子:

2026-03-10
Python
00

背景:消失的文件

在使用 Python 的 requests 库上传文件时,如果文件名包含中文,你可能会遇到一个诡异的问题:

  • 本地调试:代码运行正常,没有任何报错。
  • 服务端表现:对方声称根本没有收到文件(File 字段为空),或者收到的文件名是一串乱码(如 filename*=utf-8''...)。

即便你尝试了 encode('utf-8').decode('latin-1') 等常规编码转换,问题依然可能存在。

2026-03-09
Python
00

在Python开发中,装饰器(Decorator)是一个非常强大的特性。

它可以在 不修改原函数代码的情况下扩展函数功能,被广泛应用于:

  • 日志记录
  • 权限校验
  • 性能统计
  • 缓存
  • Web框架(Flask / FastAPI)

本文将从 原理 → 实现 → 实战应用 逐步讲解Python装饰器。