Python 3 实战教程:从零基础到项目实战

Python 3 实战教程:从零基础到项目实战

作者 :资深 DevOps 工程师

环境 :Python 3.13.12 / Windows Server 2022

关键词:Python 3、编程入门、数据类型、控制流、推导式、实战项目


目录

🎯 第一部分:入门基础

  1. [Python 3 简介](#Python 3 简介)
  2. 环境搭建
  3. [VSCode 配置](#VSCode 配置)

📖 第二部分:语法基础

  1. 基础语法
  2. 注释
  3. 解释器

🔢 第三部分:数据类型详解

  1. 基本数据类型
  2. [数字 Number](#数字 Number)
  3. 字符串
  4. 列表
  5. 元组
  6. 字典
  7. 集合

⚙️ 第四部分:数据操作

  1. 类型转换
  2. 运算符

🔄 第五部分:控制流程

  1. 条件控制
  2. 循环语句

🚀 第六部分:进阶特性

  1. 编程第一步
  2. 推导式
  3. 迭代器与生成器

📝 第七部分:实战项目

  1. 综合实战项目

🎓 第八部分:最佳实践

  1. 代码优化技巧
  2. 学习资源推荐

🎯 第一部分:入门基础

1. Python 3 简介

1.1 Python 的历史与发展

Python 由荷兰程序员 Guido van Rossum 于 1989 年圣诞节期间开始设计,1991 年发布第一个公开版本。名字来源于他喜爱的英国喜剧团体 Monty Python(「巨蟒剧团」)------而不是蛇。

关键里程碑

年份 事件
1991 Python 0.9.0 发布
2000 Python 2.0 发布,引入垃圾回收
2008 Python 3.0 发布,不兼容 Python 2
2020 Python 2.7 正式停止维护
2023+ Python 3.12/3.13 持续迭代

1.2 Python 3 vs Python 2

Python 2 已于 2020 年 1 月 1 日 EOL(End of Life),请不要再用 Python 2

特性 Python 2 Python 3
print print "hello"(语句) print("hello")(函数)
整数除法 5/2 = 2(截断) 5/2 = 2.5(浮点)
字符串 默认 ASCII 默认 Unicode
range 返回列表 返回迭代器
except except Exception, e except Exception as e
输入 raw_input() input()
状态 已停止维护 活跃开发中

1.3 Python 的应用领域

复制代码
┌─────────────────────────────────────────────┐
│           Python 3 应用领域全景              │
├──────────┬──────────┬──────────┬────────────┤
│  Web开发  │  数据分析  │  AI/ML   │  自动化运维  │
│ Django    │ NumPy     │ PyTorch  │ Ansible     │
│ Flask     │ Pandas    │ TensorFlow│ Fabric      │
│ FastAPI   │ Matplotlib│ scikit-learn│ SaltStack │
├──────────┼──────────┼──────────┼────────────┤
│  爬虫     │  测试     │  GUI     │  嵌入式     │
│ Scrapy    │ pytest    │ PyQt     │ MicroPython │
│ BeautifulSoup│ unittest │ Tkinter  │ CircuitPython│
└──────────┴──────────┴──────────┴────────────┘

1.4 为什么选择 Python 3?

  • 语法简洁:接近自然语言,一行代码顶 Java 十行
  • 生态丰富:PyPI 超过 40 万个第三方包
  • 跨平台:Windows/Linux/macOS 无缝运行
  • 学习曲线平缓:适合零基础入门
  • 社区活跃:问题基本都能找到答案

2. 环境搭建

2.1 安装 Python 3

Windows

  1. 访问 https://www.python.org/downloads/
  2. 下载最新 Python 3.x 安装包
  3. 关键步骤:勾选「Add Python to PATH」
  4. 点击 Install Now

Linux

bash 复制代码
# Ubuntu/Debian
sudo apt update && sudo apt install -y python3 python3-pip

# CentOS/RHEL
sudo yum install -y python3

macOS

bash 复制代码
# Homebrew 安装
brew install python3

2.2 验证安装

bash 复制代码
$ python3 --version
Python 3.13.12

$ python3 -c "import sys; print(f'Python {sys.version}')"
Python 3.13.12 (main, Feb  3 2026, 22:53:26) [MSC v.1944 64 bit (AMD64)]

2.3 常见问题

问题 解决方案
python 命令无效 检查 PATH 环境变量,或用 python3
pip 安装失败 python -m pip install --upgrade pip
多版本冲突 使用虚拟环境(venv)隔离

3. VSCode 配置

3.1 安装步骤

  1. 下载 VSCode:https://code.visualstudio.com/
  2. 安装 Python 扩展(Microsoft 官方)
  3. 安装 Pylance(语言服务器)

3.2 推荐插件

插件 用途
Python 核心支持
Pylance 智能提示
Black Formatter 代码格式化
Ruff Linting & 快速修复
Python Docstring Generator 自动生成文档字符串
Error Lens 行内显示错误

3.3 调试配置

json 复制代码
// .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

F5 启动调试,设置断点后程序会在断点处暂停。


📖 第二部分:语法基础

4. 基础语法

4.1 缩进规则

Python 使用缩进表示代码块,这是它与 C/Java 最大的区别。

python 复制代码
>>> x = 10
>>> if x > 5:
...     print("进入if块(4空格缩进)")
...     if x > 8:
...         print("嵌套if块(8空格缩进)")

真实执行输出

复制代码
    x = 10 > 5, 进入if块(4空格缩进)
        x = 10 > 8, 嵌套if块(8空格缩进)

踩坑提醒 :Python 3 不允许混用 Tab 和空格!VSCode 设置 "editor.insertSpaces": true 可避免。

4.2 变量命名规范(PEP 8)

python 复制代码
user_name = "Alice"          # snake_case:变量和函数
MAX_CONNECTIONS = 100        # UPPER_CASE:常量
_is_private = True           # _开头:私有属性(约定)
__very_private = "hidden"    # __开头:名称改写(name mangling)

真实执行输出

复制代码
    user_name=Alice, MAX_CONNECTIONS=100, _is_private=True
规范 示例 说明
变量/函数 user_name, calculate_total() snake_case
常量 MAX_SIZE, PI UPPER_CASE
类名 UserManager, HttpClient PascalCase
私有 _internal, __mangled 前缀下划线

5. 注释

5.1 单行注释

python 复制代码
# 这是单行注释
score = 95  # 这是行尾注释
print(score)  # 输出: 95

5.2 多行注释 & Docstring

python 复制代码
def calculate_average(scores):
    """
    计算平均分(Docstring文档字符串)

    Args:
        scores: 分数列表

    Returns:
        float: 平均分数

    Examples:
        >>> calculate_average([80, 90, 100])
        90.0
    """
    if not scores:
        return 0.0
    return sum(scores) / len(scores)

真实执行输出

复制代码
calculate_average([85, 92, 78]) = 85.0

5.3 注释最佳实践

  • 写清楚「为什么」,而非「是什么」------代码本身说明是什么
  • 复杂算法必须在注释中说明思路
  • # TODO: 标记待完成的功能
  • # FIXME: 标记已知问题
  • 所有公开函数必须有 Docstring

6. 解释器

6.1 交互式解释器(REPL)

bash 复制代码
$ python3
Python 3.13.12 (main, Feb  3 2026, 22:53:26) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 + 2
4
>>> print("Hello Python 3!")
Hello Python 3!
>>> exit()  # 或 Ctrl+Z (Windows) / Ctrl+D (Linux)

6.2 脚本执行方式

bash 复制代码
# 直接执行
python3 script.py

# 带参数执行
python3 script.py --verbose --output result.txt

# 模块方式执行
python3 -m http.server 8000

6.3 常用命令行参数

参数 作用
-c "code" 直接执行代码字符串
-m module 以模块方式运行
-i 执行后进入交互模式
-v 输出详细导入信息
-O 优化模式(移除 assert)

🔢 第三部分:数据类型详解

7. 基本数据类型

Python 3 核心六种基础类型:

python 复制代码
a_int   = 42              # int: 整数
a_float = 3.14159         # float: 浮点数
a_bool  = True            # bool: 布尔值
a_none  = None            # NoneType: 空值
a_str   = "Hello Python 3" # str: 字符串
a_bytes = b"binary data"  # bytes: 字节序列

真实执行输出

复制代码
    int:    42          (type=int)
    float:  3.14159     (type=float)
    bool:   True        (type=bool)
    None:   None        (type=NoneType)
    str:    Hello Python 3 (type=str)
    bytes:  b'binary data'  (type=bytes)

关键认知 :Python 中一切皆对象。type() 可以查看任何值的类型。


8. 数字(Number)

8.1 数学运算

python 复制代码
10 + 3    # 加: 13
10 - 3    # 减: 7
10 * 3    # 乘: 30
10 / 3    # 除(浮点): 3.3333333333333335
10 // 3   # 整除: 3
10 % 3    # 取余: 1
10 ** 3   # 幂: 1000

真实执行输出

复制代码
    加: 10 + 3 = 13
    减: 10 - 3 = 7
    乘: 10 * 3 = 30
    除(浮点): 10 / 3 = 3.3333333333333335
    整除: 10 // 3 = 3
    取余: 10 % 3 = 1
    幂: 10 ** 3 = 1000

8.2 内置数学函数

python 复制代码
abs(-10)       → 10           # 绝对值
round(3.14159, 2) → 3.14      # 四舍五入
max(1, 5, 3, 9, 2) → 9        # 最大值
min(1, 5, 3, 9, 2) → 1        # 最小值
pow(2, 10)     → 1024         # 幂运算

import math
math.pi        → 3.141592653589793
math.sqrt(144) → 12.0

8.3 随机数

python 复制代码
import random
random.seed(42)  # 固定种子,结果可复现
random.randint(1, 100)     → 82     # 1-100 随机整数
random.choice(['a','b','c']) → 'a'  # 随机选取

9. 字符串

9.1 创建与基本操作

python 复制代码
s = "  Hello, Python 3 World!  "
len(s)         → 26
s.strip()      → "Hello, Python 3 World!"
s.upper()      → "  HELLO, PYTHON 3 WORLD!  "
s.lower()      → "  hello, python 3 world!  "
s.replace('Python', 'World') → "  Hello, World 3 World!  "
s.split(',')   → ['  Hello', ' Python 3 World!  ']
s.find('Python') → 9
s.startswith('  He') → True
s.endswith('!  ')    → True

9.2 字符串格式化(三种方式对比)

python 复制代码
name = "Alice"
age = 28
score = 95.6789

# f-string(Python 3.6+,推荐)
f"{name} is {age} years old"    → "Alice is 28 years old"
f"Score: {score:.2f}"           → "Score: 95.68"

# str.format()
"{} scored {:.1f}".format(name, score) → "Alice scored 95.7"

# % 格式化(旧式,不推荐)
"%s got %d%%" % (name, 95)      → "Alice got 95%"

推荐使用 f-string:性能最佳,可读性最高。

9.3 字符串编码

python 复制代码
text = "你好Python3"
len(text)            → 9  # 字符数
text.encode('utf-8') → b'\xe4\xbd\xa0\xe5\xa5\xbdPython3'
len(encoded)         → 13 bytes  # 3个中文 * 3 = 9 + 8个ASCII = 13
对比 Python 2 Python 3
默认编码 ASCII Unicode (UTF-8)
len("你好") 6(字节) 2(字符)
中文支持 需要 # coding: utf-8 原生支持

10. 列表

10.1 基本操作

python 复制代码
fruits = ['apple', 'banana', 'cherry']
fruits.append('date')              # 追加: ['apple', 'banana', 'cherry', 'date']
fruits.insert(1, 'blueberry')      # 插入: ['apple', 'blueberry', 'banana', 'cherry', 'date']
fruits.extend(['elderberry','fig'])# 扩展: ['apple', 'blueberry', 'banana', 'cherry', 'date', 'elderberry', 'fig']
fruits.pop()                       # 弹出: 'fig', 剩余5个元素
fruits.remove('blueberry')         # 删除: ['apple', 'banana', 'cherry', 'date', 'elderberry']

10.2 列表切片(最强大的特性之一)

python 复制代码
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
切片语法 结果 说明
[2:5] [2, 3, 4] 索引2到4(不含5)
[:4] [0, 1, 2, 3] 开头到索引3
[6:] [6, 7, 8, 9] 索引6到末尾
[::2] [0, 2, 4, 6, 8] 步长为2
[::-1] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 反转
[-3:] [7, 8, 9] 最后3个

10.3 排序

python 复制代码
numbers = [5, 2, 8, 1, 9, 3]
numbers.sort()              → [1, 2, 3, 5, 8, 9]   # 就地排序
numbers.sort(reverse=True)  → [9, 8, 5, 3, 2, 1]   # 降序

names = ['Bob', 'alice', 'Charlie', 'david']
sorted(names)                    → ['Bob', 'Charlie', 'alice', 'david']       # ASCII序
sorted(names, key=str.lower)     → ['alice', 'Bob', 'Charlie', 'david']       # 不区分大小写

注意sort() 就地修改,返回 Nonesorted() 返回新列表,不修改原列表。


11. 元组

11.1 创建与访问

python 复制代码
point = (3, 4)
point[0]  → 3
point[1]  → 4
x, y = point  # 解包: x=3, y=4

11.2 元组 vs 列表

特性 列表 list 元组 tuple
可变性 可变 [] 不可变 ()
速度 较慢 较快
内存 较大 较小
用作字典键
适用场景 动态数据集合 固定数据/坐标/配置

11.3 关键踩坑点

python 复制代码
# 单元素元组必须有逗号!
single = (42,)       # tuple: (42,)
not_tuple = (42)     # int: 42  ← 这是最常见的坑!

# 元组不可变------但嵌套的可变对象内容可变!
t = (1, 2, [3, 4])
t[2].append(5)       # 合法!
# t 现在是 (1, 2, [3, 4, 5])
# 元组本身的引用没有改变,但列表内容变了

12. 字典

12.1 创建与访问

python 复制代码
student = {
    "name": "Zhang San",
    "age": 21,
    "scores": {"math": 95, "english": 88, "python": 92},
    "courses": ["Math", "English", "Python"]
}

student['name']               → "Zhang San"       # 直接访问(KeyError 如果不存在)
student.get('grade', '未知')   → "未知"            # 安全访问(推荐)
student.keys()                → ['name', 'age', 'scores', 'courses']
student.values()              → ['Zhang San', 21, {...}, [...]]
student.items()               → [('name', 'Zhang San'), ...]

12.2 基本操作

python 复制代码
d = {"a": 1, "b": 2, "c": 3}
d["d"] = 4       → {"a": 1, "b": 2, "c": 3, "d": 4}  # 添加
d["a"] = 100     → {"a": 100, "b": 2, "c": 3, "d": 4} # 修改
d.pop("c")       → 3, {"a": 100, "b": 2, "d": 4}      # 删除并返回
"a" in d         → True     # 检查键是否存在
"z" in d         → False

12.3 字典推导式 & 合并

python 复制代码
# 字典推导式
{x: x**2 for x in range(1, 6)}  → {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 合并字典(Python 3.9+)
d1 = {"a": 1, "b": 2}
d2 = {"b": 20, "c": 30}
d1 | d2       → {"a": 1, "b": 20, "c": 30}  # 注意 "b" 被覆盖
{**d1, **d2}  → 同上(Python 3.5+)

13. 集合

13.1 集合运算

python 复制代码
s1 = {1, 2, 3, 4, 5}
s2 = {4, 5, 6, 7, 8}

s1 | s2   → {1, 2, 3, 4, 5, 6, 7, 8}   # 并集
s1 & s2   → {4, 5}                       # 交集
s1 - s2   → {1, 2, 3}                    # 差集(s1有s2没有)
s1 ^ s2   → {1, 2, 3, 6, 7, 8}          # 对称差

13.2 实际应用

python 复制代码
# 最常用:列表去重
dupes = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = list(set(dupes))  → [1, 2, 3, 4]

# 集合方法
s = {1, 2, 3}
s.add(4)         → {1, 2, 3, 4}
s.remove(2)      → {1, 3, 4}      # 不存在抛 KeyError
s.discard(99)    → {1, 3, 4}      # 不存在也不报错
s.update([5, 6]) → {1, 3, 4, 5, 6}

remove vs discardremove() 元素不存在抛异常,discard() 静默忽略。优先用 discard


⚙️ 第四部分:数据操作

14. 类型转换

14.1 显式类型转换

python 复制代码
int('123')       → 123
float('3.14')    → 3.14
str(100)         → '100'
bool(1)          → True
bool(0)          → False
bool('')         → False       # 空字符串为 False
bool('hello')    → True        # 非空字符串为 True
list('abc')      → ['a', 'b', 'c']
int(3.9)         → 3           # 截断,不是四舍五入!

14.2 type() vs isinstance()

python 复制代码
type(42)           → <class 'int'>
isinstance(42, int)   → True
isinstance(42, float) → False
isinstance(True, int) → True   # ⚠️ bool 是 int 的子类!

面试考点 :Python 中 boolint 的子类,True == 1False == 0。所以 isinstance(True, int) 返回 True

14.3 常见转换陷阱

问题代码 错误 正确写法
int('3.14') ValueError int(float('3.14'))
int('abc') ValueError 先检查 str.isdigit()
str(None) 'None'(可能不是想要的) 提前判断 if x is not None

15. 运算符

15.1 算术 & 比较

python 复制代码
a, b = 10, 3
a + b → 13      a - b → 7       a * b → 30
a / b → 3.3333  a // b → 3      a % b → 1
a ** b → 1000

a == b → False  a != b → True   a > b → True
a < b → False   a >= b → True   a <= b → False

15.2 逻辑运算符(短路求值)

python 复制代码
True and False → False
True or False  → True
not True       → False

# 短路求值:如果第一个操作数已经能确定结果,不计算第二个
True or expensive()   # expensive() 不会被调用!
False and expensive() # expensive() 不会被调用!

15.3 成员 & 身份运算符

python 复制代码
# 成员运算符
'apple' in ['apple', 'banana', 'cherry']    → True
'Python' in "Hello Python World"            → True

# 身份运算符(比较内存地址)
a = [1, 2, 3]
b = [1, 2, 3]
c = a
a is b   → False  # 不同对象,即使值相等
a == b   → True   # 值相等
a is c   → True   # 同一对象

is vs ==is 比较内存地址(身份),== 比较值。None 比较时永远用 is

15.4 位运算符

python 复制代码
5 & 3   → 1    # 0101 & 0011 = 0001
5 | 3   → 7    # 0101 | 0011 = 0111
5 ^ 3   → 6    # 0101 ^ 0011 = 0110
~5      → -6   # 取反(补码)
5 << 1  → 10   # 左移 = *2
5 >> 1  → 2    # 右移 = //2

🔄 第五部分:控制流程

16. 条件控制

16.1 if/elif/else

python 复制代码
score = 85

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"           # score=85 走这里
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"
# 结果: B

16.2 三元运算符

python 复制代码
age = 20
status = "成人" if age >= 18 else "未成年"   # "成人"

16.3 链式比较(Python 独有!)

python 复制代码
x = 5
0 < x < 10     → True    # 等价于 0 < x and x < 10
3 <= x <= 7    → True    # 等价于 3 <= x and x <= 7

这是 Python 相比 Java/C 的语法优势:不用写 x > 0 && x < 10


17. 循环语句

17.1 for 循环

python 复制代码
# 基本遍历
for i in range(5):       # 0 1 2 3 4
    print(i, end=" ")

# range 参数
range(2, 10, 3)          → [2, 5, 8]   # start, stop, step

# enumerate:同时获取索引和值
for i, fruit in enumerate(['apple', 'banana', 'cherry']):
    print(f"[{i}] {fruit}")
# [0] apple
# [1] banana
# [2] cherry

# 遍历字典
for key, value in student.items():
    print(f"{key} -> {value}")

# zip:并行遍历
for name, score in zip(["Alice","Bob"], [95,87]):
    print(f"{name}: {score}分")
# Alice: 95分
# Bob: 87分

17.2 while 循环

python 复制代码
count = 5
while count > 0:
    print(count, end=" ")
    count -= 1
print("发射!")
# 输出: 5 4 3 2 1 发射!

17.3 break / continue / for-else

python 复制代码
# break:提前终止
for i in range(10):
    if i == 5:
        break          # 到 5 就停
    print(i)           # 0 1 2 3 4

# continue:跳过本次
for i in range(8):
    if i % 2 == 0:
        continue       # 跳过偶数
    print(i)           # 1 3 5 7

# for-else:循环正常结束才执行 else
for i in range(5):
    if i == 10:        # 永远找不到
        break
else:
    print("循环正常结束(未break),进入else分支")

for-else 是 Python 的特色语法:break 跳出时不执行 else,正常结束时执行。


🚀 第六部分:进阶特性

18. 编程第一步

18.1 第一个程序

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
我的第一个 Python 程序
"""

def greet(name: str) -> str:
    """返回问候语"""
    return f"Hello, {name}! Welcome to Python 3."

if __name__ == "__main__":
    print(greet("World"))

执行

复制代码
Hello, World! Welcome to Python 3.

18.2 程序结构分析

复制代码
#!/usr/bin/env python3      ← Shebang(Unix系统直接执行)
# -*- coding: utf-8 -*-     ← 编码声明(Python 3 可选)
"""模块文档字符串"""          ← 模块级 Docstring
import ...                   ← 导入语句
常量定义                      ← UPPER_CASE
类/函数定义                   ← 主要逻辑
if __name__ == "__main__":   ← 入口守护(被导入时不执行)
    main()

18.3 if __name__ == "__main__" 是什么?

python 复制代码
# 当 script.py 直接运行时
# __name__ 的值是 "__main__"
# 当被 import script 导入时
# __name__ 的值是 "script"
# 所以这段代码只在直接运行时执行

19. 推导式

19.1 列表推导式

python 复制代码
# 基本形式
[x**2 for x in range(1, 11)]       → [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 带过滤条件
[x for x in range(1, 21) if x % 2 == 0]  → [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# 带 if-else
['偶数' if x % 2 == 0 else '奇数' for x in range(1, 6)]
→ ['奇数', '偶数', '奇数', '偶数', '奇数']

# 嵌套(展平二维列表)
matrix = [[1,2,3], [4,5,6], [7,8,9]]
[n for row in matrix for n in row]  → [1, 2, 3, 4, 5, 6, 7, 8, 9]

19.2 字典推导式

python 复制代码
# 字符频率统计
word = "hello world"
{c: word.count(c) for c in set(word) if c != ' '}
→ {'h': 1, 'd': 1, 'e': 1, 'l': 3, 'o': 2, 'r': 1, 'w': 1}

# 键值反转
{"a": 1, "b": 2, "c": 3}  →  {1: 'a', 2: 'b', 3: 'c'}

19.3 推导式性能实测

python 复制代码
import time
n = 1_000_000

# 列表推导式
start = time.perf_counter()
result = [x**2 for x in range(n)]
t_listcomp = time.perf_counter() - start

# 传统 for 循环
start = time.perf_counter()
result = []
for x in range(n):
    result.append(x**2)
t_loop = time.perf_counter() - start

真实执行输出

复制代码
列表推导式: 0.1635s
传统循环:   0.2542s
推导式快了 1.6 倍

推导式更快的原因:Python 在 C 层面优化了推导式的循环逻辑,减少了属性查找开销。

19.4 生成器表达式

python 复制代码
# 用圆括号 = 生成器表达式
gen = (x**2 for x in range(1, 6))
type(gen)      → generator
list(gen)      → [1, 4, 9, 16, 25]

# 与列表推导式的区别:
# [x**2] → 列表,立即计算,占内存
# (x**2) → 生成器,惰性计算,省内存

20. 迭代器与生成器

20.1 迭代器协议

迭代器必须实现 __iter__()__next__()

python 复制代码
it = iter([1, 2, 3])
next(it) → 1
next(it) → 2
next(it) → 3
next(it) → StopIteration!  # 迭代结束

20.2 自定义迭代器

python 复制代码
class CountDown:
    """倒计时迭代器"""
    def __init__(self, start):
        self.current = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        self.current -= 1
        return self.current + 1

cd = CountDown(5)
list(cd)  → [5, 4, 3, 2, 1]

20.3 生成器函数(yield)

python 复制代码
def fibonacci(n):
    """生成前n个斐波那契数"""
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

list(fibonacci(10))  → [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

yield 的执行机制

复制代码
第一次 next() → 进入函数,执行到 yield 1,暂停并返回 1
第二次 next() → 从上次暂停处继续,执行到 yield 2,暂停并返回 2
第三次 next() → 从上次暂停处继续,执行到 yield 3,暂停并返回 3
第四次 next() → 函数结束,抛出 StopIteration

20.4 生成器管道

python 复制代码
def read_lines():
    for line in ["10", "20", "30", "abc", "40", "50"]:
        yield line

def parse_int(lines):
    for line in lines:
        try:
            yield int(line)
        except ValueError:
            print(f"跳过无效行: '{line}'")

def square_numbers(numbers):
    for n in numbers:
        yield n ** 2

# 组合管道
results = list(square_numbers(parse_int(read_lines())))

真实执行输出

复制代码
跳过无效行: 'abc'
结果: [100, 400, 900, 1600, 2500]

生成器管道像 Unix 管道 |:数据逐级流过,每级惰性处理。

20.5 内存对比

python 复制代码
big_gen  = (x for x in range(10_000_000))
big_list = list(range(10_000_000))

真实执行输出

复制代码
生成器大小: 192 bytes
列表大小:   80,000,056 bytes
差距:       416,666x

生成器只占 192 字节,列表占了 80MB! 处理大数据时,生成器是必选项。


📝 第七部分:实战项目

21. 综合实战项目

项目 1:学生管理系统

python 复制代码
class StudentManager:
    def __init__(self):
        self.students = {}

    def add(self, sid, name, score):
        self.students[sid] = {"name": name, "score": score}
        return f"添加成功: {sid} {name} {score}分"

    def get(self, sid):
        s = self.students.get(sid)
        return f"{sid}: {s['name']} - {s['score']}分" if s else "未找到"

    def list_all(self):
        if not self.students:
            return "无学生记录"
        return "\n".join(f"  {sid}: {info['name']} - {info['score']}分" 
                         for sid, info in sorted(self.students.items()))

    def avg_score(self):
        scores = [s["score"] for s in self.students.values()]
        return sum(scores) / len(scores) if scores else 0

真实执行输出

复制代码
添加成功: 001 张三 92分
添加成功: 002 李四 85分
添加成功: 003 王五 78分
添加成功: 004 赵六 95分
查询002: 002: 李四 - 85分
查询999: 未找到
全部学生:
  001: 张三 - 92分
  002: 李四 - 85分
  003: 王五 - 78分
  004: 赵六 - 95分
平均分: 87.5

项目 2:简易计算器

python 复制代码
import math

class Calculator:
    @staticmethod
    def add(a, b): return a + b
    @staticmethod
    def sub(a, b): return a - b
    @staticmethod
    def mul(a, b): return a * b
    @staticmethod
    def div(a, b):
        if b == 0:
            raise ZeroDivisionError("除数不能为零!")
        return a / b
    @staticmethod
    def power(a, b): return a ** b
    @staticmethod
    def sqrt(a):
        if a < 0:
            raise ValueError("不能对负数开平方!")
        return math.sqrt(a)

真实执行输出

复制代码
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
10 / 3 = 3.33
2 ** 10 = 1024
sqrt(144) = 12.0
10 / 0 -> 错误: 除数不能为零!

项目 3:文本处理工具

python 复制代码
from collections import Counter

def text_stats(text: str):
    lines = text.strip().split('\n')
    words = text.split()
    word_freq = Counter(w.lower().rstrip('.,\'\"') for w in words)
    return {
        "总行数": len(lines),
        "总单词数": len(words),
        "总字符数": len(text),
        "不重复单词": len(word_freq),
        "最常见的3个词": word_freq.most_common(3),
        "平均每行单词": f"{len(words) / len(lines):.1f}"
    }

真实执行输出(分析一段 Python 英文描述):

复制代码
总行数: 5
总单词数: 22
总字符数: 182
不重复单词: 22
最常见的3个词: [('python', 1), ('is', 1), ('an', 1)]
平均每行单词: 4.4

项目 4:数据统计分析

python 复制代码
import random, math
random.seed(42)
data = [random.gauss(70, 10) for _ in range(50)]  # 模拟考试成绩

class DataAnalyzer:
    @staticmethod
    def analyze(numbers):
        n = len(numbers)
        mean = sum(numbers) / n
        sorted_n = sorted(numbers)
        median = (sorted_n[n//2] + sorted_n[n//2-1]) / 2 if n % 2 == 0 else sorted_n[n//2]
        variance = sum((x - mean) ** 2 for x in numbers) / n
        std_dev = math.sqrt(variance)
        return {
            "样本数": n,
            "均值": f"{mean:.2f}",
            "中位数": f"{median:.2f}",
            "最大值": f"{max(numbers):.2f}",
            "最小值": f"{min(numbers):.2f}",
            "标准差": f"{std_dev:.2f}",
            "及格率(>=60)": f"{sum(1 for x in numbers if x >= 60) / n * 100:.1f}%",
            "优秀率(>=90)": f"{sum(1 for x in numbers if x >= 90) / n * 100:.1f}%",
        }

真实执行输出(50个正态分布样本):

复制代码
样本数: 50
均值: 69.42
中位数: 70.76
最大值: 83.11
最小值: 43.80
标准差: 7.96
及格率(>=60): 84.0%
优秀率(>=90): 0.0%

🎓 第八部分:最佳实践

22. 代码优化技巧

22.1 异常处理

python 复制代码
def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "错误: 除数不能为零"
    except TypeError:
        return "错误: 类型不匹配"

safe_divide(10, 2)    → 5.0
safe_divide(10, 0)    → "错误: 除数不能为零"
safe_divide('a', 2)   → "错误: 类型不匹配"

异常处理原则

  • 具体胜于泛化except ValueError 而非 except Exception
  • 永远不要 except: pass(吞掉异常)
  • finally 用于资源清理:文件关闭、数据库连接释放

22.2 性能优化 checklist

优化项 做法 收益
用推导式 [x**2 for x in data] ~1.5-2x
用生成器 (x**2 for x in data) 内存 400,000x 减少
join 拼接字符串 ''.join(list) ~5x
用集合做成员检查 x in my_set O(1) vs O(n)
用局部变量缓存 f = obj.method; f() 减少属性查找
避免不必要的拷贝 islice 代替 list[:n] 省内存

22.3 字符串拼接对比

python 复制代码
# ❌ 慢(每次 + 都创建新字符串)
result = ""
for s in strings:
    result += s

# ✅ 快(一次 join)
result = "".join(strings)

22.4 内存管理

  • Python 使用引用计数 + 标记-清除 垃圾回收
  • del x 减少引用计数
  • 大对象用完及时 del 或让变量离开作用域
  • sys.getsizeof() 查看对象占用
  • __slots__ 减少类实例的内存占用

23. 学习资源推荐

23.1 官方资源

资源 地址
官方文档 https://docs.python.org/zh-cn/3/
Python 教程 https://docs.python.org/zh-cn/3/tutorial/
PEP 8 风格指南 https://peps.python.org/pep-0008/
PyPI https://pypi.org/

23.2 推荐书籍

书籍 适合人群
《Python编程:从入门到实践》 零基础入门
《流畅的Python》(Fluent Python) 进阶必读
《Python Cookbook》 实战技巧
《Effective Python》 写出 Pythonic 代码

23.3 在线练习平台

平台 特点
LeetCode 算法面试
HackerRank 分专题练习
CodeWars 趣味编程挑战
Kaggle 数据科学实战

23.4 社区资源

  • 中文社区:Python 中文开发者社区、知乎 Python 话题
  • 英文社区:r/Python、Stack Overflow、Real Python
  • GitHub :搜索 awesome-python 获取精选资源列表

🔑 核心速查表

数据类型速查

复制代码
int:    42, -10, 0xFF, 0o77, 0b1010
float:  3.14, 1e-3, .5
str:    "hello", 'world', f"x={x}", """multiline"""
bool:   True, False
list:   [1, 2, 3], list(range(10))
tuple:  (1, 2), (42,), tuple("abc")
dict:   {"key": "val"}, dict(a=1, b=2)
set:    {1, 2, 3}, set([1,2,2,3])

常用内置函数速查

复制代码
len(x)          → 长度
type(x)         → 类型
range(n)        → 0..n-1
enumerate(lst)  → (索引, 值)
zip(a, b)       → 并行迭代
sorted(lst)     → 排序
reversed(lst)   → 反转
map(fn, lst)    → 映射
filter(fn, lst) → 过滤
sum(lst)        → 求和
min/max/abs     → 最值/绝对值
any/all         → 任意/全部为True

本文所有代码均在 Python 3.13.12 上真实执行并通过 ,输出结果直接来自实际运行,非模拟数据。

如果你喜欢这篇文章,欢迎分享给正在学习 Python 的朋友!

相关推荐
用户8356290780511 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780511 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生9 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师10 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码10 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf10 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780511 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent1 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6251 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python