悟夕导航 - Python
type: channel
link: https://wxdh.com/index.php/python/
description: Python 编程语言系列教程
items: 🐍 Python 第五课：传说之境——工程化、架构与部署
items: 🐍 Python 第四课：王者之路——高阶特性与实战开发
items: 🐍 Python 第三课：从白银到黄金——文件操作、模块与面向对象
items: 🐍 Python 第二课：让程序有脑子——控制流与函数
items: 🐍 Python 第一课：从零开始，与蛇共舞

🐍 Python 第五课：传说之境——工程化、架构与部署
type: item
date: 2026-03-06T09:27:12+08:00
description: 课程目标：掌握测试驱动开发（TDD），让代码质量有保障学会类型提示，让代码自文档化代码规范与自动化工具，告别"屎山"Docker 容器化部署，一次构建到处运行性能优化与Profiling，找到瓶颈设计模式与架构思想，写出"优雅"的代码微服务入门，为大型系统做准备1) 回顾上节课上节课我们学会了：生成器与迭代器：省内存的神器装饰器：给函数"开挂"上下文管理器：资源管理更优雅并发编程：多线程、多进程、异步IO数据库操作：SQLite与SQLAlchemyWeb开发：Flask框架常见问题解答：Q：异步代码里能直接用time.sleep()吗？A：不行！time.sleep()会阻塞整个事件循环。要用await asyncio.sleep()，这样等待时可以把控制权交给其他任务。Q：SQLAlchemy的session什么时候关闭？A：推荐用上下文管理器：with Session() as session:，或者确保在请求结束时关闭，避免连接泄漏。2) 测试驱动开发（TDD）：先写测试，再写代码为什么要测试？手动测试的痛苦：改一行代码，手动测10个功能，漏了一个就线上故障重构的勇气：有测试覆盖，才敢大胆重构文档作用：测试用例就是最佳使用示例pytest：Python测试之王# 安装 pip install pytest pytest-cov基本用法：# calculator.py def add(a, b): return a + b def divide(a, b): if b == 0: raise ValueError("不能除以零") return a / b# test_calculator.py import pytest from calculator import add, divide def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0 assert add(0.1, 0.2) == pytest.approx(0.3) # 浮点数比较 def test_divide(): assert divide(10, 2) == 5 assert divide(7, 2) == 3.5 def test_divide_by_zero(): with pytest.raises(ValueError, match="不能除以零"): divide(10, 0)运行测试：pytest -v # 详细输出 pytest -s # 显示print输出 pytest --cov=calculator # 覆盖率报告 pytest -k "add" # 只运行名字包含add的测试Fixture：测试的"脚手架"import pytest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from models import Base, User @pytest.fixture def db_session(): """每个测试用例都使用全新的内存数据库""" engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() yield session # 提供session给测试用例 session.close() # 测试结束后清理 def test_create_user(db_session): user = User(name="张三", email="zhangsan@example.com") db_session.add(user) db_session.commit() result = db_session.query(User).first() assert result.name == "张三"Mock：模拟外部依赖from unittest.mock import Mock, patch import requests def get_weather(city): """获取天气（实际会调用外部API）""" resp = requests.get(f"https://api.weather.com/{city}") return resp.json() def test_get_weather(): # 模拟requests.get，避免真实网络请求 mock_response = Mock() mock_response.json.ret…

🐍 Python 第四课：王者之路——高阶特性与实战开发
type: item
date: 2026-03-05T12:17:00+08:00
description: 课程目标：掌握生成器与迭代器，写出省内存的高效代码学会装饰器，给函数"开挂"理解上下文管理器，让资源管理更优雅初探并发编程，让程序快如闪电数据库操作，让数据有个家Web 开发入门，做个能访问的网站1) 回顾上节课上节课我们学会了：文件读写与 JSON 处理模块、包与虚拟环境面向对象编程：类、继承、封装、魔术方法实战：学生管理系统常见问题解答：Q：self 到底是个啥？A：self 就是对象自己。调用 dog.bark() 时，Python 自动把 dog 作为第一个参数传给 bark(self)，所以 self.name 就是 dog.name。Q：继承时 super() 是干嘛的？A：调用父类的方法。比如子类构造方法里 super().__init__() 就是执行父类的构造，避免重复写代码。2) 生成器与迭代器：省内存的神器迭代器（Iterator）迭代器是"懒加载"的代表，一次只给你一个元素，而不是一次性全塞给你。# 列表是一次性生成所有元素，占内存 big_list = [i for i in range(10000000)] # 内存爆炸！ # 迭代器：用的时候再生成 big_iter = iter(range(10000000)) # 几乎不占内存 print(next(big_iter)) # 0 print(next(big_iter)) # 1 # ... 要一个给一个自定义迭代器：class CountDown: def __init__(self, start): self.start = start def __iter__(self): return self def __next__(self): if self.start <= 0: raise StopIteration # 迭代结束的信号 self.start -= 1 return self.start + 1 # 使用 for num in CountDown(5): print(num) # 5, 4, 3, 2, 1生成器（Generator）：更简单的迭代器写 __iter__ 和 __next__ 太麻烦？用 yield！def countdown(start): while start > 0: yield start # 暂停在这里，返回 start，下次从这里继续 start -= 1 # 使用 for num in countdown(5): print(num) # 5, 4, 3, 2, 1 # 本质 gen = countdown(3) print(next(gen)) # 5 print(next(gen)) # 4 # ...生成器表达式（类比列表推导式）：# 列表推导式：一次性生成所有，占内存 squares_list = [x**2 for x in range(1000000)] # 生成器表达式：惰性求值，省内存 squares_gen = (x**2 for x in range(1000000)) # 使用时才计算 for sq in squares_gen: if sq > 100: break # 后面的根本不生成，省了大量计算实际应用：读取大文件def read_large_file(file_path): """逐行读取大文件，不会内存溢出""" with open(file_path, 'r', encoding='utf-8') as f: for line in f: yield line.strip() # 一次只处理一行 # 处理 10GB 的日志文件也毫无压力 for line in read_large_file('huge_log.txt'): process(line) # 处理每一行3) 装饰器：给函数"穿装备"什么是装饰器？装饰器就是一个接收函数作为参数，返回函数的高阶函数。用来在不修改原函数的情况下，增加额外功能。import time def timer(func): """计算函数运行时间的装饰器""" def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) # 执行原函数 end = time.time() print(f"{func.__name__} 耗时：{end - start:.4f}秒") return result return wrapper # 使用装饰器 @timer # 等价于：slow_function = timer(slow_function) def slow_function(): time.sleep(1) print("函数…

🐍 Python 第三课：从白银到黄金——文件操作、模块与面向对象
type: item
date: 2026-03-04T11:38:38+08:00
description: 课程目标：学会读写文件，让数据不再"随风而逝"掌握模块和包，告别"把所有代码写在一个文件里"的野蛮时代初探面向对象编程（OOP），理解"类"和"对象"这对好基友认识常用标准库，站在 Python 的肩膀上完成一个实战小项目，把所学知识串起来1) 回顾上节课上节课我们学会了：条件判断（if/elif/else）：让程序有脑子循环（while/for）：让程序有毅力函数：代码的打包艺术数据结构：列表、字典、元组、集合错误处理：try/except/finally常见问题解答：Q：为什么我的列表修改后，另一个变量也变了？a = [1, 2, 3] b = a b.append(4) print(a) # [1, 2, 3, 4] WTF？！A：因为 b = a 不是复制，而是给同一个列表起了两个名字！要复制用 b = a.copy() 或 b = list(a)。Q：函数里修改传入的列表，外面的列表也会变？A：是的！因为传的是引用（地址）。如果不想影响原列表，先在函数里 copy() 一份。2) 文件操作：让数据"永生"程序关闭后，变量里的数据就消失了。要持久保存，得写入文件。读取文件# 方法1：传统方式（记得手动关闭！） f = open("story.txt", "r", encoding="utf-8") content = f.read() # 读取全部 print(content) f.close() # 别忘了关！否则资源泄露 # 方法2：with 语句（推荐！自动关闭） with open("story.txt", "r", encoding="utf-8") as f: content = f.read() # 出了这个缩进，文件自动关闭，就算出错也会关打开模式：模式说明"r"只读（默认），文件不存在报错"w"只写，会清空原有内容！ 文件不存在则创建"a"追加，在末尾添加，不清空"r+"读写"b"二进制模式（如 "rb"、"wb"），用于图片、视频等各种读取方法with open("data.txt", "r", encoding="utf-8") as f: # 方法1：read() 读取全部，大文件会卡死 all_content = f.read() # 方法2：readline() 读一行 first_line = f.readline() # 方法3：readlines() 读取为列表，每行一个元素 lines = f.readlines() # 方法4：直接遍历（最推荐，省内存） for line in f: print(line.strip()) # strip() 去掉行末的换行符写入文件# 写入会覆盖原内容！ with open("output.txt", "w", encoding="utf-8") as f: f.write("Hello, World!\n") f.write("第二行\n") lines = ["第一行\n", "第二行\n", "第三行\n"] f.writelines(lines) # 写入多行，注意要自己加换行符追加模式：with open("log.txt", "a", encoding="utf-8") as f: f.write("2024-01-01: 用户登录\n") # 在文件末尾添加，不覆盖文件和目录操作（os 模块）import os # 文件操作 os.rename("old.txt", "new.txt") # 重命名 os.remove("trash.txt") # 删除文件 os.path.exists("file.txt") # 判断是否存在 os.path.getsize("file.txt") # 获取文件大小（字节） # 目录操作 os.mkdir("newfolder") # 创建目录 os.rmdir("empty_folder") # 删除空目录 os.listdir(".") # 列出目录内容 os.getcwd() # 获取当前工作目录 os.chdir("/path/to/dir") # 切换目录 # 路径拼接（跨平台！Windows 用 \，Linux/Mac 用 /） path = os.path.join("folder", "subfolder", "file.txt") # 结果：Windows 下是 "folder\subfolder\file.txt" # Linux/Mac 下是 "folder/subfolder/file.txt"JSON 数据处理JSON 是网络数据交换的标准格式，Python 有内置支持：import json data = { "name": "张三", "age": 25, "hobb…

🐍 Python 第二课：让程序有脑子——控制流与函数
type: item
date: 2026-03-03T13:15:53+08:00
description: 课程目标：让程序学会做判断（if/else）：不再是傻乎乎地从上往下执行让程序学会循环（for/while）：重复的事情交给它，你去喝咖啡学会写函数：把代码打包，一次编写，到处使用认识基本数据结构：列表、字典、元组——数据的"收纳盒"学会处理错误：让程序优雅地崩溃（或者不要崩溃）1) 回顾上节课上节课我们学会了：安装 Python（如果还没装好，请回去补课）写第一个程序 print("Hello, Python!")变量和数据类型（int、float、str、bool）输入输出（input() 和 print()）常见问题解答：Q：为什么我的 input() 得到的数字不能加减？A：因为 input() 得到的是字符串！需要用 int() 或 float() 转换。就像你问朋友"你多大了"，他回答"二十"，这是文字；你要做算术，得把它理解成数字 20。Q：运行程序时提示 "IndentationError" 是什么意思？A：缩进错误！Python 用缩进表示代码块，就像用括号表示段落。缩进不一致，Python 会抓狂。检查你是不是混用了空格和 Tab。2) 条件判断：if/else——让程序有脑子现实生活中，我们经常要做判断：如果下雨，就带伞；否则，就不带如果年满 18 岁，可以投票；否则，回家写作业程序也需要这种能力！基本语法age = int(input("请输入你的年龄：")) if age >= 18: print("你已经成年了，可以投票！") else: print("未成年，回家写作业去吧！")注意：if 后面加冒号 :，表示"我要开始说条件成立时要做的事了"下一行要缩进（4 个空格），表示这些是"条件成立时"的代码else 后面也要加冒号 :，表示"否则的话"多条件判断：elif如果不止两种情况呢？用 elif（else if 的缩写）：score = int(input("请输入你的成绩：")) if score >= 90: print("优秀！") elif score >= 80: print("良好") elif score >= 60: print("及格") else: print("不及格，准备补考吧...")执行逻辑：先检查 score >= 90，成立就打印"优秀"，然后跳过其他所有条件不成立，检查 score >= 80，成立就打印"良好"，然后跳过其他以此类推...如果都不成立，执行 else比较运算符运算符含义例子==等于5 == 5 为 True!=不等于5 != 3 为 True>大于5 > 3 为 True<小于5 < 3 为 False>=大于等于5 >= 5 为 True<=小于等于3 <= 5 为 True注意： == 是两个等号，表示"判断是否相等"；= 是一个等号，表示"赋值"。写错的话，Python 会报错或者产生奇怪的结果。逻辑运算符：and、or、not有时候需要组合多个条件：age = 25 income = 5000 # 申请信用卡的条件：年满 18 且收入超过 3000 if age >= 18 and income > 3000: print("信用卡申请通过！") else: print("抱歉，条件不满足") # 或者：VIP 用户或者消费满 1000 可以打折 is_vip = True spent = 800 if is_vip or spent >= 1000: print("可以享受折扣！") else: print("原价支付") # not：取反 is_raining = False if not is_raining: print("今天不下雨，可以出去玩")优先级： not > and > or，不确定就加括号！嵌套 if：if 里面套 ifis_member = True purchase_amount = 200 if is_member: if purchase_amount >= 100: print("会员且满 100，打 8 折") else: print("会员但不满 100，打 9 折") else: print("非会员，原价")建议： 嵌套不要超过 3 层，否则代码会像迷宫一样难读。如果逻辑太复杂，考虑拆分或者优化。3) 循环：重复的事情，让程序干while 循环：当...的时候，就一直做# 倒计时程序 count = 5 while count > 0: print(count) count = count - 1 # 或者写成 count -= 1 print("发射！🚀")执行过程：检查 count > 0，5 > 0 成立，执行循环体打印 5，count 变成 4检查 count > 0，4 > 0 成立，执…

🐍 Python 第一课：从零开始，与蛇共舞
type: item
date: 2026-03-02T13:15:00+08:00
description: 课程目标：搞明白 Python 到底是啥（不是蟒蛇，放心）在你的电脑上"养"一条 Python（安装）学会跟它说第一句话写出一个能跑的程序，而不是能跑的 bug1) Python 是什么？能吃吗？Python 是一种高级编程语言，诞生于 1989 年。创始人 Guido van Rossum 在圣诞节闲得无聊（是的，大神也和我们一样），于是创造了这门语言。为什么叫 Python？不是因为创始人喜欢蟒蛇，而是因为他喜欢 BBC 的喜剧《Monty Python's Flying Circus》。所以如果你学 Python 时感到欢乐，那很符合创始人的初衷！Python 的特点：语法简洁：像读英语一样读代码，不像某些语言（说的就是你，C++）需要写一堆分号和花括号解释型语言：边写边跑，不用等编译。就像外卖 vs 自己做饭，即点即食跨平台：Windows、Mac、Linux 通吃，写一次，到处跑（Java 听了想打人）生态丰富：你想做的事，大概率有人已经写好了库，直接"拿来吧你"应用领域：数据分析（Excel 看了会沉默）人工智能（让机器学会摸鱼）Web 开发（做个网站唬人）自动化脚本（让电脑帮你干活，你负责喝茶）爬虫（合法地在网上"爬"数据）2) 为什么学 Python？因为人生苦短！Python 社区有句名言："Life is short, you need Python"（人生苦短，我用 Python）。理由一：上手快别的语言写个"Hello World"需要 5 行，Python 只需要 1 行。少写的代码，都是少掉的头发。理由二：社区庞大遇到问题？百度一下，Stack Overflow 一下，GitHub 一下。如果还解决不了……那可能是你的问题太前沿了，恭喜你要发论文了。理由三：就业面广从月薪 5k 的脚本小子到年薪 50w 的算法工程师，Python 都能陪你走。当然，工资高低取决于你学得多深，以及头发还剩多少。3) 安装 Python：给你的电脑注入灵魂第一步：下载去 python.org 下载最新版 Python 3.x。注意：不要下载 Python 2.x！ 那已经是"上古神器"了，现在用它会被人当成出土文物。第二步：安装（Windows 用户看这里！）安装时，一定要勾选 "Add Python to PATH"！不勾这个选项，以后在命令行输入 python，电脑会一脸懵逼地问："python 是什么？能吃吗？"第三步：验证安装打开命令行/终端，输入：python --version或者python3 --version如果看到类似 Python 3.x.x 的输出，恭喜你！Python 已经住进你的电脑了。如果看到 "'python' 不是内部或外部命令"，请回到第二步，重新安装并勾选那个该死的选项。运行 Python 的两种方式方式一：交互式解释器（REPL）在命令行输入 python 或 python3，你会看到 >>> 这个提示符。这表示 Python 在听候你的差遣，输入一行，执行一行。>>> print("我是一条 Python 程序") 我是一条 Python 程序 >>> 1 + 1 2 >>> exit() # 输入这个退出，或者直接按 Ctrl+D/Ctrl+Z方式二：写脚本文件创建一个文件叫 hello.py（注意后缀是 .py，不是 .txt，虽然 Windows 很喜欢把后缀藏起来），然后用编辑器打开。推荐编辑器：IDLE：Python 自带的，朴素但能用，就像你奶奶织的毛衣VS Code：微软出品，免费好用，插件丰富，程序员的主流选择PyCharm：JetBrains 出品，功能强大，专业版收费（但社区版免费且够用）Jupyter Notebook：数据分析必备，可以一边写代码一边写笔记，适合装X4) 第一个程序：Hello, Python!打开你的编辑器，输入以下"神级代码"：# 这是我的第一个 Python 程序 # 虽然它很简单，但每一个大神都是从这里开始的 print("Hello, Python!")保存为 hello.py，然后在命令行运行：python hello.py见证奇迹的时刻！ 如果看到 Hello, Python!，说明你的程序跑起来了。如果看到满屏红色报错……检查一下是不是把 print 拼成了 prnit。小知识点：# 开头的是注释，Python 会无视它，但人类需要它来理解代码print() 是一个函数，作用是把括号里的内容输出到屏幕引号里的内容是字符串，就是一串文字5) 变量：给数据起个名字在 Python 里，变量就像是贴标签的盒子。你把数据放进去，贴个标签，以后通过标签就能找到数据。name = "张三" # 字符串，用引号包起来 age = 25 …