Python 从零开始:全流程实战教程(7大模块 + 服务器上机演练)
环境 :华为云 FlexusX x2e.8u.16g | Ubuntu 24.04.4 LTS | Python 3.12.3 | vim 9.1 | git 2.43.0
服务器 :ecs-88e7-0001 (139.9.128.210) | 8vCPU 16GiB | 可用区7
适合人群 :零基础入门 → 系统掌握 Python 核心语法
本文特色:所有代码均在真实服务器上执行,输出均为原始终端回显
目录
- [第一章 先跑起来](#第一章 先跑起来)
- [第二章 变量与基本数据类型](#第二章 变量与基本数据类型)
- [第三章 容器类型](#第三章 容器类型)
- [第四章 条件分支结构](#第四章 条件分支结构)
- [第五章 循环结构](#第五章 循环结构)
- [第六章 函数](#第六章 函数)
- [第七章 系统环境](#第七章 系统环境)
服务器环境概览
┌─────────────────────────────────────────────────────────────┐
│ 华为云 FlexusX 集群拓扑 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ecs-88e7-0001│ │ ecs-88e7-0002│ │ ecs-88e7-0003│ │
│ │ 139.9.128.210│ │ 123.249.77.59│ │119.3.175.171 │ │
│ │ 192.168.0.93 │ │ 192.168.0.88 │ │192.168.0.100 │ │
│ │ 8vCPU/16GiB │ │ 8vCPU/16GiB │ │ 8vCPU/16GiB │ │
│ │ Ubuntu 24.04 │ │ Ubuntu 24.04 │ │ Ubuntu 24.04 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ │
│ │ ecs-88e7-0004│ │
│ │114.116.240.3 │ │
│ │192.168.0.202 │ │
│ │ 8vCPU/16GiB │ │
│ │ Ubuntu 24.04 │ │
│ └──────────────┘ │
│ │
│ 全动态BGP 5Mbit/s | 按需计费 | 可用区7 │
└─────────────────────────────────────────────────────────────┘
环境验证
bash
$ python3 --version
Python 3.12.3
$ which python3
/usr/bin/python3
$ vim --version | head -3
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Mar 10 2026 09:13:01)
Included patches: 1-16, 647, 678, 697
Modified by team+vim@tracker.debian.org
$ git --version
git version 2.43.0
$ cat /etc/os-release | head -5
PRETTY_NAME="Ubuntu 24.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.4 LTS (Noble Numbat)"
第一章 先跑起来
1.1 Hello World ------ 程序员的浪漫
1972 年 K&R 在《The C Programming Language》中首次使用 hello, world 作为示例程序,此后几乎每种编程语言的教程都以此为起点。
python
# hello.py --- 第一个 Python 程序
#!/usr/bin/env python3
"""第一个Python程序"""
import sys
def greet(name="World"):
return f"Hello, {name}!"
if __name__ == "__main__":
print(greet())
print(greet("Python"))
print(f"Python {sys.version_info.major}.{sys.version_info.minor}")
服务器执行结果:
$ cat /root/hello.py # 查看源码
#!/usr/bin/env python3
"""第一个Python程序"""
import sys
def greet(name="World"):
return f"Hello, {name}!"
if __name__ == "__main__":
print(greet())
print(greet("Python"))
print(f"Python {sys.version_info.major}.{sys.version_info.minor}")
$ python3 /root/hello.py # 运行
Hello, World!
Hello, Python!
Python 3.12
$ chmod +x /root/hello.py && /root/hello.py # 赋予执行权限后直接运行
Hello, World!
Hello, Python!
Python 3.12
踩坑提示 :直接运行
.py文件需要两步:①chmod +x赋予执行权限;② 文件首行必须有正确的 shebang(#!/usr/bin/env python3)。
1.2 print 函数详解
print() 是 Python 最常用的内建函数,源自电传打字机(Teleprinter)时代的 PRINT 命令。
python
# 基本输出
print("hello world") # 双引号
print('hello world') # 单引号(等价)
# sep 参数:分隔符(默认空格)
print("apple", "banana", "cherry", sep=" | ")
# 输出: apple | banana | cherry
# end 参数:结束符(默认换行 \n)
print("line1", end=" >>> ")
print("line2")
# 输出: line1 >>> line2
# 输出字符(通过 ASCII 码)
print("\x68\x65\x6c\x6c\x6f") # 输出: hello
服务器执行结果:
hello world
hello world
hello
apple | banana | cherry
line1 >>> line2
1.3 数学运算
python
print(3 + 5) # 8 加法
print(10 / 3) # 3.3333333333333335 除法(浮点)
print(10 // 3) # 3 整除
print(2 ** 10) # 1024 幂运算
print(17 % 5) # 2 取余
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | 3 + 5 |
8 |
- |
减法 | 10 - 3 |
7 |
* |
乘法 | 4 * 5 |
20 |
/ |
除法(浮点) | 10 / 3 |
3.333... |
// |
整除 | 10 // 3 |
3 |
** |
幂运算 | 2 ** 10 |
1024 |
% |
取余 | 17 % 5 |
2 |
1.4 type 查看数据类型
python
print(type(42)) # <class 'int'>
print(type("hello")) # <class 'str'>
print(type(3.14)) # <class 'float'>
print(type([1,2,3])) # <class 'list'>
print(type({"a":1})) # <class 'dict'>
1.5 多重赋值与解包
python
a, b, c = 1, 2, 3 # 多重赋值
print(a, b, c) # 1 2 3
x = y = z = 0 # 连等赋值
print(x, y, z) # 0 0 0
m, *n = [1, 2, 3, 4] # 星号解包
print(m, n) # 1 [2, 3, 4]
1.6 异常处理
python
# NameError:使用未定义的变量
print(undefined_var)
# Traceback (most recent call last):
# File "<string>", line 1, in <module>
# NameError: name 'undefined_var' is not defined
# SyntaxError:语法错误(引号未闭合)
print("hello
# File "<string>", line 1
# print("hello
# ^
# SyntaxError: unterminated string literal (detected at line 1)
try-except-finally 完全体:
python
try:
x = 1 / 0
except ZeroDivisionError as e:
print(f"捕获异常: {e}")
except Exception as e:
print(f"其他异常: {e}")
else:
print("没有异常时执行")
finally:
print("无论如何都执行")
捕获异常: division by zero
无论如何都执行
| 子句 | 执行时机 |
|---|---|
try |
尝试执行的代码块 |
except |
捕获指定异常 |
else |
try 块没有异常时执行 |
finally |
无论是否有异常都执行(清理工作) |
1.7 pdb3 调试器
Python 内置调试器 pdb(Python Debugger),是 C 语言 gdb 的 Python 版本。
常用命令速查:
| 命令 | 缩写 | 功能 |
|---|---|---|
help |
h |
查看帮助 |
next |
n |
执行下一行(不进入函数) |
step |
s |
执行下一行(进入函数) |
continue |
c |
继续执行到下一断点 |
list |
l |
查看当前代码上下文 |
print |
p |
打印变量值 |
break |
b |
设置断点 |
until |
unt |
跳转到指定行 |
where |
w |
查看调用栈 |
quit |
q |
退出调试 |
1.8 Python 之禅
python
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
...
词根溯源 :
Zen源自日语「禅(ぜん)」,Tim Peters 以此表达 Python 追求简洁优雅的设计哲学。
1.9 系统信息与 builtins
python
import os, sys, platform, builtins
print(f"用户: {os.getenv('USER')}") # root
print(f"Python路径: {sys.executable}") # /usr/bin/python3
print(f"Python版本: {sys.version}") # 3.12.3 (main, Mar 3 2026...)
print(f"平台: {platform.platform()}") # Linux-6.8.0-106-generic-x86_64-with-glibc2.39
print(f"当前目录: {os.getcwd()}") # /root
bfuncs = [x for x in dir(builtins) if not x.startswith("_")]
print(f"内建函数数量: {len(bfuncs)}") # 149
print(f"前20个: {bfuncs[:20]}")
用户: root
Python路径: /usr/bin/python3
Python版本: 3.12.3 (main, Mar 3 2026, 12:15:18) [GCC 13.3.0]
平台: Linux-6.8.0-106-generic-x86_64-with-glibc2.39
当前目录: /root
内建函数数量: 149
前20个: ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BaseExceptionGroup', 'BlockingIOError', 'BrokenPipeError', 'BufferError',
'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError',
'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception']
第二章 变量与基本数据类型
2.1 ord 与 chr ------ 字符与序号
python
# ord:字符 → ASCII序号 (ordinal)
print(f"ord('a') = {ord('a')}") # 97
print(f"ord('A') = {ord('A')}") # 65
print(f"ord('0') = {ord('0')}") # 48
# chr:序号 → 字符 (character)
print(f"chr(97) = {chr(97)}") # a
print(f"chr(65) = {chr(65)}") # A
print(f"chr(9829) = {chr(9829)}") # ♥
print(f"chr(128512) = {chr(128512)}") # 😀
词根溯源 :
ord来自拉丁语 ordinalis (序数的),chr是 character(字符)的缩写。ASCII(American Standard Code for Information Interchange)源自 ISO 646 标准。
2.2 type 类型体系
┌─────────────────────────────────────────────┐
│ Python 数据类型层级 │
├─────────────────────────────────────────────┤
│ │
│ 基本类型: │
│ int 整数 42 │
│ float 浮点数 3.14 │
│ str 字符串 "hello" │
│ bool 布尔值 True / False │
│ NoneType 空值 None │
│ bytes 字节序列 b'hello' │
│ │
│ 容器类型: │
│ list 列表 [1, 2, 3] │
│ tuple 元组 (1, 2, 3) │
│ set 集合 {1, 2, 3} │
│ dict 字典 {"a": 1} │
│ │
└─────────────────────────────────────────────┘
服务器执行结果:
type(42) = <class 'int'>
type(3.14) = <class 'float'>
type('hello') = <class 'str'>
type(True) = <class 'bool'>
type(None) = <class 'NoneType'>
type([1,2]) = <class 'list'>
type((1,2)) = <class 'tuple'>
type({1,2}) = <class 'set'>
type({1:2}) = <class 'dict'>
type(b'bytes') = <class 'bytes'>
2.3 int 类型与进制转换
python
# 字符串转整数(支持指定进制)
print(f"int('123') = {int('123')}") # 123
print(f"int('ff', 16) = {int('ff', 16)}") # 255 (十六进制)
print(f"int('101', 2) = {int('101', 2)}") # 5 (二进制)
print(f"int('777', 8) = {int('777', 8)}") # 511 (八进制)
# 整数转各进制字符串
print(f"bin(255) = {bin(255)}") # 0b11111111
print(f"oct(255) = {oct(255)}") # 0o377
print(f"hex(255) = {hex(255)}") # 0xff
# 数学运算
print(f"2 ** 10 = {2 ** 10}") # 1024
print(f"17 // 5 = {17 // 5}") # 3
print(f"17 % 5 = {17 % 5}") # 2
print(f"divmod(17, 5) = {divmod(17, 5)}") # (3, 2) → (商, 余数)
| 函数 | 功能 | 示例 | 结果 |
|---|---|---|---|
int(str, base) |
字符串转整数 | int('ff', 16) |
255 |
bin(n) |
整数转二进制 | bin(255) |
0b11111111 |
oct(n) |
整数转八进制 | oct(255) |
0o377 |
hex(n) |
整数转十六进制 | hex(255) |
0xff |
abs(n) |
绝对值 | abs(-42) |
42 |
pow(a, b) |
幂运算 | pow(2, 10) |
1024 |
divmod(a, b) |
商和余数 | divmod(17, 5) |
(3, 2) |
2.4 字符串 str 操作
python
s = "Hello, Python!"
print(f"len(s) = {len(s)}") # 14
print(f"s[0] = '{s[0]}'") # H
print(f"s[-1] = '{s[-1]}'") # !
print(f"s[0:5] = '{s[0:5]}'") # Hello
print(f"s[7:] = '{s[7:]}'") # Python!
print(f"s.upper() = '{s.upper()}'") # HELLO, PYTHON!
print(f"s.lower() = '{s.lower()}'") # hello, python!
print(f"s.split(', ') = {s.split(', ')}") # ['Hello', 'Python!']
print(f"'Python' in s = {'Python' in s}") # True
print(f"s.replace('Python', 'World')") # Hello, World!
print(f"s.find('Python') = {s.find('Python')}") # 7
print(f"' trim '.strip() = '{' trim '.strip()}'") # trim
字符串切片索引图:
字符串: H e l l o , P y t h o n !
正向索引: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
反向索引:-14-13-12-11-10 -9 -8 -7 -6 -5 -4 -3 -2 -1
s[0:5] → "Hello"
s[7:] → "Python!"
s[-1] → "!"
s[::-1] → "!nohtyP ,olleH" (翻转)
2.5 变量内存地址 id
python
a = 100
b = 100
print(f"id(a) = {id(a)}")
print(f"id(b) = {id(b)}")
print(f"a is b = {a is b}") # True --- 小整数缓存[-5, 256]
c = 1000
d = 1000
print(f"id(c) = {id(c)}")
print(f"id(d) = {id(d)}")
print(f"c is d = {c is d}") # Python 3.12+ 优化后可能 True
踩坑提示 :CPython 对
[-5, 256]范围内的整数做了缓存(interning),同一值的变量指向同一内存地址。超过此范围的整数不保证缓存。is判断的是对象身份 (内存地址),==判断的是值相等。
2.6 标识符与命名法
python
snake_case = "蛇形命名法 (Python推荐)"
camelCase = "小驼峰 (Java/JS风格)"
PascalCase = "大驼峰 (类名)"
_print = "下划线开头 (内部/私有变量)"
__private = "双下划线 (触发名称改写)"
| 命名法 | 格式 | Python使用场景 | 示例 |
|---|---|---|---|
| 蛇形 snake_case | 单词小写+下划线 | 变量、函数、模块 | my_variable |
| 大驼峰 PascalCase | 每词首字母大写 | 类名 | MyClass |
| 全大写 UPPER_CASE | 全大写+下划线 | 常量 | MAX_SIZE |
| 双下划线 | __name |
私有属性 | __private_var |
| 前后双下划线 | __name__ |
魔术方法 | __init__ |
2.7 Python 关键字
python
import keyword
print(f"关键字数量: {len(keyword.kwlist)}") # 35
False None True and as assert
async await break class continue def
del elif else except finally for
from global if import in is
lambda nonlocal not or pass raise
return try while with yield
注意 :
False、None、True在 Python 3 中是关键字,不能作为变量名赋值。若不小心覆盖了del print恢复(从builtins模块重新获取)。
2.8 删除变量 del
python
temp = 42
print(f"删除前: temp = {temp}")
del temp
try:
print(temp)
except NameError as e:
print(f"删除后: NameError - {e}")
删除前: temp = 42
删除后: NameError - name 'temp' is not defined
2.9 dir() 查看作用域
python
x = 10
y = "hello"
print(f"dir() = {dir()}")
# ['PascalCase', '__annotations__', '__builtins__', ... , 'x', 'y']
2.10 input 函数
python
# input() 总是返回 str 类型
name = input("请输入你的名字: ") # 模拟输入 "Alice"
print(f"你好, {name}!")
print(f"type(input()) = {type(name)}") # <class 'str'>
词根溯源 :
input中的prompt(提示符)来自拉丁语 promptus(拿出的、即时的),指程序「拿出」一个问题等待用户回答。
2.11 random 随机数
python
import random
random.seed(42) # 固定种子便于复现
print(f"random.random() = {random.random():.6f}") # 0.639427
print(f"random.randint(1, 100) = {random.randint(1, 100)}") # 4
print(f"random.choice('abcdefg') = {random.choice('abcdefg')}") # f
# 生成6位验证码
code = ''.join(random.choices('0123456789', k=6))
print(f"6位验证码: {code}") # 755002
# 彩票选号
print(f"双色球: {random.sample(range(1, 50), 6)}") # [18, 16, 15, 9, 7, 44]
| 函数 | 功能 | 返回值 |
|---|---|---|
random() |
[0, 1) 浮点随机数 | float |
randint(a, b) |
a, b 整数随机数 | int |
choice(seq) |
从序列随机选一个 | 元素 |
choices(seq, k=n) |
有放回选n个 | list |
sample(seq, k=n) |
无放回选n个 | list |
shuffle(seq) |
原地打乱 | None |
seed(n) |
设置随机种子 | None |
2.12 异常处理完全体
python
def safe_divide(a, b):
try:
result = a / b
except ZeroDivisionError:
print(f" 错误: {a} / {b} -> 除零异常")
return None
except TypeError as e:
print(f" 错误: 类型异常 -> {e}")
return None
else:
print(f" 成功: {a} / {b} = {result}")
return result
finally:
print(f" finally: 清理工作完成")
safe_divide(10, 3) # 成功
safe_divide(10, 0) # 除零异常
safe_divide("10", 3) # 类型异常
成功: 10 / 3 = 3.3333333333333335
finally: 清理工作完成
错误: 10 / 0 -> 除零异常
finally: 清理工作完成
错误: 类型异常 -> unsupported operand type(s) for /: 'str' and 'int'
finally: 清理工作完成
2.13 动态类型
Python 是动态类型(Dynamic Typing)语言------变量类型在运行时确定,同一变量可反复赋不同类型的值:
python
var = 42 # int
var = "hello" # str
var = [1, 2, 3] # list
var = 3.14 # float
| 类型系统 | 说明 | Python | Java | C++ |
|---|---|---|---|---|
| 动态/静态 | 类型何时确定 | 动态 | 静态 | 静态 |
| 强/弱 | 隐式类型转换 | 强 | 强 | 弱/中 |
| 编译/运行 | 类型检查时机 | 运行 | 编译 | 编译 |
第三章 容器类型
3.1 容器类型总览
┌─────────────────────────────────────────────────────────┐
│ Python 容器类型对比 │
├──────────┬──────┬──────┬────────┬───────────────────────┤
│ 类型 │ 有序 │ 可变 │ 允许重复│ 示例 │
├──────────┼──────┼──────┼────────┼───────────────────────┤
│ list │ ✓ │ ✓ │ ✓ │ [1, 2, 3] │
│ tuple │ ✓ │ ✗ │ ✓ │ (1, 2, 3) │
│ set │ ✗ │ ✓ │ ✗ │ {1, 2, 3} │
│ dict │ ✓* │ ✓ │ 键不重复│ {'a': 1} │
│ str │ ✓ │ ✗ │ ✓ │ 'hello' │
│ bytes │ ✓ │ ✗ │ ✓ │ b'hello' │
├──────────┴──────┴──────┴────────┴───────────────────────┤
│ * Python 3.7+ dict 保持插入顺序 │
└─────────────────────────────────────────────────────────┘
3.2 list 列表
python
fruits = ["apple", "banana", "cherry"]
print(f"原始列表: {fruits}")
# 追加
fruits.append("date")
print(f"append('date'): {fruits}")
# 插入
fruits.insert(1, "avocado")
print(f"insert(1, 'avocado'): {fruits}")
# 删除
fruits.remove("avocado")
print(f"remove('avocado'): {fruits}")
# 弹栈
popped = fruits.pop()
print(f"pop() -> {popped}, 列表: {fruits}")
# 索引
print(f"fruits[0] = '{fruits[0]}', fruits[-1] = '{fruits[-1]}'")
print(f"fruits.index('banana') = {fruits.index('banana')}")
原始列表: ['apple', 'banana', 'cherry']
append('date'): ['apple', 'banana', 'cherry', 'date']
insert(1, 'avocado'): ['apple', 'avocado', 'banana', 'cherry', 'date']
remove('avocado'): ['apple', 'banana', 'cherry', 'date']
pop() -> date, 列表: ['apple', 'banana', 'cherry']
fruits[0] = 'apple', fruits[-1] = 'cherry'
fruits.index('banana') = 1
list 方法速查表:
| 方法 | 功能 | 时间复杂度 | 返回值 |
|---|---|---|---|
append(x) |
尾部追加 | O(1) | None |
insert(i, x) |
指定位置插入 | O(n) | None |
remove(x) |
删除首个匹配 | O(n) | None |
pop([i]) |
弹出末尾/指定 | O(1)/O(n) | 元素 |
index(x) |
查找索引 | O(n) | int |
count(x) |
计数 | O(n) | int |
sort() |
原地排序 | O(n log n) | None |
reverse() |
原地翻转 | O(n) | None |
extend(iter) |
扩展列表 | O(k) | None |
clear() |
清空 | O(n) | None |
copy() |
浅拷贝 | O(n) | list |
3.3 list 切片
切片语法:list[start:stop:step],左闭右开。
python
lst = list(range(10))
print(f"lst = {lst}")
print(f"lst[2:5] = {lst[2:5]}") # [2, 3, 4]
print(f"lst[:3] = {lst[:3]}") # [0, 1, 2]
print(f"lst[7:] = {lst[7:]}") # [7, 8, 9]
print(f"lst[-3:] = {lst[-3:]}") # [7, 8, 9]
print(f"lst[::2] = {lst[::2]}") # [0, 2, 4, 6, 8] 步长2
print(f"lst[::-1] = {lst[::-1]}") # [9, 8, 7, ..., 0] 翻转
# 切片赋值(嫁接)
lst2 = [1, 2, 3, 4, 5]
lst2[1:3] = [20, 30, 40]
print(f"切片赋值: {lst2}") # [1, 20, 30, 40, 5]
3.4 list 排序
python
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(f"sorted(): {sorted(data)}") # 返回新列表
print(f"sort(reverse=True): {sorted(data, reverse=True)}")
# key 参数
words = ["banana", "apple", "cherry", "date"]
print(f"按长度排序: {sorted(words, key=len)}")
print(f"按末尾字母: {sorted(words, key=lambda x: x[-1])}")
sorted(): [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
sort(reverse=True): [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
按长度排序: ['date', 'apple', 'banana', 'cherry']
按末尾字母排序: ['banana', 'date', 'apple', 'cherry']
sort()vssorted():sort()是列表方法,原地排序,返回None;sorted()是内建函数,返回新列表,不修改原列表。sorted()可用于任何可迭代对象。
3.5 list 统计与运算
python
scores = [85, 92, 78, 90, 88, 76, 95]
print(f"max = {max(scores)}") # 95
print(f"min = {min(scores)}") # 76
print(f"sum = {sum(scores)}") # 604
print(f"avg = {sum(scores)/len(scores):.2f}") # 86.29
# 加法与乘法
print(f"[1,2] + [3,4] = {[1,2] + [3,4]}") # [1, 2, 3, 4]
print(f"[0] * 5 = {[0] * 5}") # [0, 0, 0, 0, 0]
3.6 二维列表与矩阵转置
python
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 转置
transposed = [[row[i] for row in matrix] for i in range(3)]
print(f"转置: {transposed}") # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# 多维排序
students = [("Alice", 90), ("Bob", 85), ("Charlie", 92)]
students.sort(key=lambda x: x[1], reverse=True)
print(f"按成绩排序: {students}")
3.7 浅拷贝 vs 深拷贝
浅拷贝 (copy.copy): 深拷贝 (copy.deepcopy):
┌──────────┐ ┌──────────┐
│ 新列表 │ │ 新列表 │
│ [0] ────→│ 原内层列表 │ [0] ────→│ 全新内层列表
│ [1] ────→│ 原内层列表 │ [1] ────→│ 全新内层列表
└──────────┘ └──────────┘
内层列表被共享 完全独立
python
import copy
original = [[1, 2], [3, 4]]
# 浅拷贝 --- 内层列表共享
shallow = copy.copy(original)
shallow[0][0] = 99
print(f"浅拷贝修改后 original[0][0] = {original[0][0]}") # 99(受影响)
# 深拷贝 --- 完全独立
original2 = [[1, 2], [3, 4]]
deep = copy.deepcopy(original2)
deep[0][0] = 99
print(f"深拷贝修改后 original2[0][0] = {original2[0][0]}") # 1(不受影响)
3.8 元组 tuple
元组是不可变列表,创建后不能修改。
python
t = (1, 2, 3, 4, 5)
print(f"t[0] = {t[0]}, len(t) = {len(t)}")
print(f"t.count(3) = {t.count(3)}, t.index(4) = {t.index(4)}")
print(f"t + (6, 7) = {t + (6, 7)}")
print(f"t * 2 = {t * 2}")
# 封包解包
x, y, z = 10, 20, 30 # 解包
a, *b = t # 星号解包
print(f"解包: x={x}, y={y}, z={z}")
print(f"星号解包: a={a}, b={b}") # a=1, b=[2, 3, 4, 5]
3.9 集合 set
python
s1 = {1, 2, 3, 4, 5}
s2 = {4, 5, 6, 7, 8}
print(f"交集 s1 & s2 = {s1 & s2}") # {4, 5}
print(f"并集 s1 | s2 = {s1 | s2}") # {1,2,3,4,5,6,7,8}
print(f"差集 s1 - s2 = {s1 - s2}") # {1, 2, 3}
print(f"对称差 s1 ^ s2 = {s1 ^ s2}") # {1,2,3,6,7,8}
集合运算图解:
s1 s2
┌──────┐ ┌──────┐
│ 1 2 3│ 4 5 │6 7 8 │
└──────┘ └──────┘
交集 &: 并集 |:
┌──────┐ ┌──────────┐
│ 4 5 │ │1 2 3 4 5 │
└──────┘ │ 6 7 8 │
└──────────┘
差集 -: 对称差 ^:
┌──────┐ ┌──────────┐
│ 1 2 3│ │1 2 3 6 7 8│
└──────┘ └──────────┘
3.10 字典 dict
词根溯源 :
dict来自拉丁语 dictio (说话、言辞),引申为「词典型数据结构」------通过「词」(key)查找「释义」(value)。Python 的dict在 3.7+ 保证插入顺序。
python
student = {
"name": "Alice",
"age": 20,
"grade": "A",
"courses": ["Math", "CS", "English"]
}
# 存取
print(f"student['name'] = {student['name']}")
print(f"student.get('age') = {student.get('age')}")
print(f"student.get('phone', 'N/A') = {student.get('phone', 'N/A')}")
# 增删改
student["phone"] = "123456" # 添加
del student["phone"] # 删除
student["age"] = 21 # 修改
# 遍历
for key, value in student.items():
print(f" {key}: {value}")
# zip 构造字典
keys = ["name", "age", "city"]
values = ["Bob", 25, "Beijing"]
d = dict(zip(keys, values))
print(f"zip构造: {d}")
# 字典排序
scores = {"Alice": 90, "Bob": 85, "Charlie": 92}
sorted_scores = dict(sorted(scores.items(), key=lambda x: x[1], reverse=True))
print(f"按值排序: {sorted_scores}") # {'Charlie': 92, 'Alice': 90, 'Bob': 85}
字典方法速查:
| 方法 | 功能 | 示例 |
|---|---|---|
d[key] |
取值(KeyError) | d['name'] |
d.get(key, default) |
安全取值 | d.get('phone', 'N/A') |
d[key] = value |
设置值 | d['age'] = 20 |
del d[key] |
删除键 | del d['phone'] |
d.pop(key) |
弹出键值 | d.pop('age') |
d.keys() |
所有键 | list(d.keys()) |
d.values() |
所有值 | list(d.values()) |
d.items() |
键值对 | list(d.items()) |
d.update(d2) |
合并字典 | d.update({'x': 1}) |
d.setdefault(key, val) |
键不存在时设置 | d.setdefault('x', 0) |
3.11 推导式
推导式(Comprehension)是 Python 最优雅的特性之一,用一行代码生成容器。
python
# 列表推导式
squares = [x**2 for x in range(1, 11)]
print(f"平方: {squares}")
evens = [x for x in range(20) if x % 2 == 0]
print(f"偶数: {evens}")
# 条件表达式
result = ["偶" if x % 2 == 0 else "奇" for x in range(1, 11)]
print(f"奇偶: {result}")
# 嵌套推导式 --- 九九乘法表
table = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(f"乘法表: {table}")
# 集合推导式
unique_chars = {c for c in "hello world"}
print(f"唯一字符: {unique_chars}")
# 字典推导式
word_len = {w: len(w) for w in ["apple", "banana", "cherry"]}
print(f"单词长度: {word_len}")
3.12 容器布尔值
python
print(f"bool([]) = {bool([])}") # False --- 空容器为假
print(f"bool([0]) = {bool([0])}") # True --- 非空容器为真
print(f"bool('') = {bool('')}") # False
print(f"bool(' ') = {bool(' ')}") # True --- 空格不是空字符串
print(f"bool({{}}) = {bool({})}") # False
print(f"bool({{0:0}}) = {bool({0:0})}") # True
踩坑提示 :
bool([0])为True------列表中有一个元素0,列表非空即为真。0本身为假,但包含0的列表非空。这是初学者常犯的逻辑错误。
第四章 条件分支结构
4.1 if-elif-else 分支
python
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(f"成绩 {score} -> 等级 {grade}") # 成绩 85 -> 等级 B
┌─────────────────────────────────────┐
│ 成绩等级判断流程 │
├─────────────────────────────────────┤
│ │
│ score >= 90 ──Yes──→ A │
│ │ No │
│ score >= 80 ──Yes──→ B │
│ │ No │
│ score >= 70 ──Yes──→ C │
│ │ No │
│ score >= 60 ──Yes──→ D │
│ │ No │
│ └──────────→ F │
│ │
└─────────────────────────────────────┘
4.2 比较运算符
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
> |
大于 | 10 > 20 |
False |
< |
小于 | 10 < 20 |
True |
== |
等于 | 10 == 20 |
False |
!= |
不等于 | 10 != 20 |
True |
>= |
大于等于 | 10 >= 20 |
False |
<= |
小于等于 | 10 <= 20 |
True |
序列比较(逐元素比较):
python
[1,2,3] < [1,2,4] # True --- 前两个相同,第三个 3 < 4
'abc' < 'abd' # True --- 字符串逐字符比较
'abc' < 'abcd' # True --- 前缀相同,短的更小
(1,2) < (1,3) # True
4.3 成员判断 in
python
3 in [1,2,3] # True
'a' in 'apple' # True
5 in (1,2,3) # False
'name' in {'name':'Bob'} # True (检查的是键)
4.4 逻辑运算 and / or / not
python
True and False # False
True or False # True
not True # False
5 > 3 and 2 < 4 # True
5 > 3 or 1 > 2 # True
短路求值(Short-circuit evaluation):
python
# and: 左操作数为 False 时,右操作数不执行
False and test() # test() 不会被调用
# or: 左操作数为 True 时,右操作数不执行
True or test() # test() 不会被调用
4.5 bool 函数 --- 真值测试
python
# 以下值在布尔上下文中为 False
bool(0) # False
bool(0.0) # False
bool('') # False
bool([]) # False
bool({}) # False
bool(None) # False
# 其他所有值为 True
bool(1) # True
bool(-1) # True (负数也为真)
bool('a') # True
bool([0]) # True (非空列表)
4.6 三目运算符
Python 的三目运算符语法:value_if_true if condition else value_if_false
python
age = 20
status = "成年" if age >= 18 else "未成年"
print(f"age={age} -> {status}") # 成年
# 嵌套三目
score = 75
result = "优秀" if score >= 90 else ("良好" if score >= 80 else ("及格" if score >= 60 else "不及格"))
print(f"score={score} -> {result}") # 及格
4.7 is vs ==
python
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(f"a == b = {a == b}") # True --- 值相等
print(f"a is b = {a is b}") # False --- 不是同一对象
print(f"a is c = {a is c}") # True --- 同一对象(c 引用 a)
| 运算符 | 比较内容 | 示例 |
|---|---|---|
== |
值是否相等 | [1,2] == [1,2] → True |
is |
内存地址是否相同 | [1,2] is [1,2] → False |
is not |
内存地址不同 | [1,2] is not [1,2] → True |
4.8 石头剪子布
python
import random
choices = ["石头", "剪刀", "布"]
player = random.choice(choices)
computer = random.choice(choices)
print(f"玩家: {player} 电脑: {computer}")
if player == computer:
print("平局!")
elif (player == "石头" and computer == "剪刀") or \
(player == "剪刀" and computer == "布") or \
(player == "布" and computer == "石头"):
print("玩家赢!")
else:
print("电脑赢!")
玩家: 石头 电脑: 剪刀
玩家赢!
4.9 判断闰年
python
def is_leap_year(year):
if year % 400 == 0: # 能被400整除 → 闰年
return True
elif year % 100 == 0: # 能被100但不被400整除 → 平年
return False
elif year % 4 == 0: # 能被4但不被100整除 → 闰年
return True
else:
return False
for year in [2000, 2024, 2100, 2023, 2026]:
print(f" {year}年: {'闰年' if is_leap_year(year) else '平年'}")
2000年: 闰年
2024年: 闰年
2100年: 平年
2023年: 平年
2026年: 平年
第五章 循环结构
5.1 while 循环
python
count = 0
while count < 5:
print(f" count = {count}")
count += 1
# while-else: 循环正常结束(非 break 退出)时执行 else
n = 0
while n < 3:
print(f" n = {n}")
n += 1
else:
print(f" 循环正常结束, n = {n}")
count = 0
count = 1
count = 2
count = 3
count = 4
n = 0
n = 1
n = 2
循环正常结束, n = 3
5.2 break 和 continue
python
for i in range(10):
if i == 5:
break # 跳出整个循环
if i % 2 == 0:
continue # 跳过本次循环
print(f" i = {i}")
# 输出: 1, 3 (5 时 break)
| 关键字 | 功能 | 影响范围 |
|---|---|---|
break |
跳出当前循环 | 当前层循环 |
continue |
跳过本次迭代 | 当前层循环 |
else |
循环正常结束时执行 | 仅 while/for |
5.3 for 循环遍历
python
# 遍历列表
for fruit in ["apple", "banana", "cherry"]:
print(f" 水果: {fruit}")
# 遍历字符串
for ch in "Python":
print(ch, end="") # Python
# 遍历字典
for key, value in {"name": "Alice", "age": 20}.items():
print(f" {key}: {value}")
# range 三种形式
print(range(5)) # 0,1,2,3,4
print(range(2, 8)) # 2,3,4,5,6,7
print(range(0, 10, 2)) # 0,2,4,6,8
5.4 enumerate 和 zip
python
# enumerate --- 带索引遍历
for idx, val in enumerate(["a", "b", "c", "d"]):
print(f" [{idx}] {val}")
# zip --- 并行缝合
names = ["Alice", "Bob", "Charlie"]
scores = [90, 85, 92]
for name, score in zip(names, scores):
print(f" {name}: {score}分")
# zip 构造字典
name_score = dict(zip(names, scores))
print(f" zip->dict: {name_score}")
[0] a
[1] b
[2] c
[3] d
Alice: 90分
Bob: 85分
Charlie: 92分
zip->dict: {'Alice': 90, 'Bob': 85, 'Charlie': 92}
5.5 嵌套循环 --- 九九乘法表
python
for i in range(1, 4):
for j in range(1, i + 1):
print(f" {j}x{i}={i*j}", end="")
print()
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
5.6 经典算法实战
水仙花数
python
narcissistic = []
for n in range(100, 1000):
a, b, c = n // 100, n // 10 % 10, n % 10
if a**3 + b**3 + c**3 == n:
narcissistic.append(n)
print(f" 水仙花数: {narcissistic}") # [153, 370, 371, 407]
鸡兔同笼
python
# 头共35个,脚共94只
heads, legs = 35, 94
for chickens in range(heads + 1):
rabbits = heads - chickens
if 2 * chickens + 4 * rabbits == legs:
print(f" 鸡={chickens}, 兔={rabbits}") # 鸡=23, 兔=12
break
5.7 any 和 all 函数
python
print(f"any([0, 0, 1]) = {any([0, 0, 1])}") # True --- 任一为真
print(f"any([0, 0, 0]) = {any([0, 0, 0])}") # False
print(f"all([1, 1, 1]) = {all([1, 1, 1])}") # True --- 全部为真
print(f"all([1, 0, 1]) = {all([1, 0, 1])}") # False
print(f"any([]) = {any([])}") # False --- 空可迭代
print(f"all([]) = {all([])}") # True --- 空可迭代(数学约定)
5.8 循环性能优化
python
import time
# 普通循环
start = time.time()
result1 = []
for i in range(100000):
if i % 2 == 0:
result1.append(i ** 2)
t1 = time.time() - start
# 列表推导式
start = time.time()
result2 = [i ** 2 for i in range(100000) if i % 2 == 0]
t2 = time.time() - start
print(f" 普通循环: {t1:.4f}s")
print(f" 推导式: {t2:.4f}s")
print(f" 推导式快: {t1/t2:.2f}x")
普通循环: 0.0077s
推导式: 0.0052s
推导式快: 1.49x
优化建议:列表推导式比等价的 for 循环 + append 快约 1.2~1.5 倍,因为推导式在 CPython 内部以 C 速度执行,避免了重复的方法查找和函数调用开销。
第六章 函数
6.1 函数定义与调用
python
def greet(name, greeting="Hello"):
"""问候函数"""
return f"{greeting}, {name}!"
print(greet("World")) # Hello, World!
print(greet("Python", "Hi")) # Hi, Python!
print(greet(name="Alice", greeting="Hey")) # Hey, Alice!
print(f"文档字符串: {greet.__doc__}") # 问候函数
6.2 参数分类
┌─────────────────────────────────────────────────────────┐
│ Python 函数参数分类 │
├─────────────────────────────────────────────────────────┤
│ │
│ def func(a, b, c=0, *args, **kwargs): │
│ │ │ │ │ └─ 关键字可变参数 **kwargs │
│ │ │ │ └─ 位置可变参数 *args │
│ │ │ └─ 默认参数 c=0 │
│ │ └─ 位置参数 b │
│ └─ 位置参数 a │
│ │
│ 调用顺序: 位置参数 → 默认参数 → *args → **kwargs │
│ │
└─────────────────────────────────────────────────────────┘
python
def func(*args, **kwargs):
print(f" args = {args}") # 元组
print(f" kwargs = {kwargs}") # 字典
func(1, 2, 3, x=10, y=20)
# args = (1, 2, 3)
# kwargs = {'x': 10, 'y': 20}
词根溯源 :
parameter(形参)来自希腊语 para- (旁边)+ metron (测量),指函数定义中的「形式参数」;argument(实参)来自拉丁语 arguere(使清楚、论证),指调用时传入的「实际参数」。
6.3 返回值
python
def divide(a, b):
"""返回商和余数"""
return a // b, a % b # 返回元组
quotient, remainder = divide(17, 5) # 解包
print(f"商={quotient}, 余={remainder}") # 商=3, 余=2
# 无 return 等价于 return None
def no_return():
pass
print(no_return()) # None
6.4 变量作用域
┌──────────────────────────────────────────┐
│ Python 变量作用域 (LEGB) │
├──────────────────────────────────────────┤
│ │
│ L - Local 函数内部局部变量 │
│ E - Enclosing 外层函数变量(nonlocal) │
│ G - Global 模块级全局变量 │
│ B - Built-in 内建名称 (print, len...) │
│ │
│ 查找顺序: L → E → G → B │
│ │
└──────────────────────────────────────────┘
python
global_var = "全局变量"
def scope_test():
local_var = "局部变量"
print(f" 函数内访问全局: {global_var}")
print(f" 函数内访问局部: {local_var}")
scope_test()
# global 声明
counter = 0
def increment():
global counter # 声明使用全局变量
counter += 1
increment()
increment()
increment()
print(f" counter = {counter}") # 3
# nonlocal 声明
def outer():
x = 10
def inner():
nonlocal x # 声明使用外层函数变量
x += 5
return x
return inner
print(f" nonlocal: {outer()()}") # 15
6.5 可变默认参数陷阱
python
# 陷阱:可变默认参数在函数定义时只创建一次,后续调用共享
def append_to(item, lst=[]):
lst.append(item)
return lst
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] --- 列表被共享!
print(append_to(3)) # [1, 2, 3] --- 继续累积!
# 正确做法:使用 None 作为哨兵
def append_to_safe(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(append_to_safe(1)) # [1]
print(append_to_safe(2)) # [2] --- 每次新建
踩坑提示 :这是 Python 最经典的陷阱之一。默认参数在
def语句执行时求值(仅一次),不是每次调用时重新创建。可变对象(list/dict/set)作为默认参数会在多次调用间共享状态。
6.6 递归
python
# 阶乘递归
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(f"5! = {factorial(5)}") # 120
print(f"10! = {factorial(10)}") # 3628800
# 斐波那契 --- 递归(低效)
def fib_recursive(n):
if n <= 1:
return n
return fib_recursive(n-1) + fib_recursive(n-2)
# 斐波那契 --- 迭代(高效)
def fib_iter(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
print(f"fib(10)递归 = {fib_recursive(10)}") # 55
print(f"fib(10)迭代 = {fib_iter(10)}") # 55
# lru_cache 优化递归
from functools import lru_cache
@lru_cache(maxsize=128)
def fib_cached(n):
if n <= 1:
return n
return fib_cached(n-1) + fib_cached(n-2)
print(f"fib(30)缓存版 = {fib_cached(30)}") # 832040
print(f"缓存信息: {fib_cached.cache_info()}")
# CacheInfo(hits=28, misses=31, maxsize=128, currsize=31)
| 方法 | 时间复杂度 | 空间复杂度 | fib(30) |
|---|---|---|---|
| 递归(无缓存) | O(2^n) | O(n) | 极慢 |
| 递归 + lru_cache | O(n) | O(n) | 瞬间 |
| 迭代 | O(n) | O(1) | 瞬间 |
6.7 匿名函数 lambda
python
square = lambda x: x ** 2
print(f"lambda square(5) = {square(5)}") # 25
add = lambda x, y: x + y
print(f"lambda add(3,4) = {add(3, 4)}") # 7
# lambda + sort
students = [("Alice", 90), ("Bob", 85), ("Charlie", 92)]
students.sort(key=lambda x: x[1])
print(f"按成绩排序: {students}")
# lambda + map/filter
nums = range(1, 11)
squares = list(map(lambda x: x**2, nums))
print(f"map平方: {squares}")
evens = list(filter(lambda x: x % 2 == 0, nums))
print(f"filter偶数: {evens}")
6.8 函数作为一等公民
Python 函数是「一等对象」(First-class Object),可以赋值给变量、作为参数传递、作为返回值。
python
# 函数作为参数
def apply(func, value):
return func(value)
print(apply(square, 5)) # 25
print(apply(len, 'hello')) # 5
# 函数作为返回值(闭包)
def make_multiplier(factor):
def multiplier(x):
return x * factor
return multiplier
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
6.9 装饰器入门
python
import time
def timer(func):
"""计时装饰器"""
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start
print(f" {func.__name__}耗时: {elapsed:.6f}s")
return result
return wrapper
@timer
def slow_sum(n):
return sum(range(n))
result = slow_sum(1000000)
# slow_sum耗时: 0.012658s
# 结果: 499999500000
6.10 类型提示
python
from typing import List, Optional
def typed_function(x: int, y: str, z: Optional[float] = None) -> List[int]:
"""带类型提示的函数"""
return [x, len(y)]
print(typed_function(10, 'hello')) # [10, 5]
注意 :类型提示(Type Hint)在 Python 3.5+ 引入,是可选的 ------不强制运行时检查。配合
mypy工具可进行静态类型检查。
6.11 argparse 命令行参数解析
python
import argparse
parser = argparse.ArgumentParser(description='计算器')
parser.add_argument('x', type=int, help='第一个数')
parser.add_argument('y', type=int, help='第二个数')
parser.add_argument('--op', default='add', choices=['add','sub','mul','div'])
# 模拟: python calc.py 10 3 --op add
args = parser.parse_args(['10', '3', '--op', 'add'])
ops = {'add': lambda a,b: a+b, 'sub': lambda a,b: a-b,
'mul': lambda a,b: a*b, 'div': lambda a,b: a/b}
print(f"{args.x} {args.op} {args.y} = {ops[args.op](args.x, args.y)}")
# 10 add 3 = 13
第七章 系统环境
7.1 time 模块
python
import time
# Unix 时间戳(从 1970-01-01 00:00:00 UTC 开始的秒数)
print(f"time.time() = {time.time():.2f}") # 1782916429.86
print(f"time.ctime() = {time.ctime()}") # Wed Jul 1 22:33:49 2026
# 结构化时间
t = time.localtime()
print(f"localtime() = {t}")
# time.struct_time(tm_year=2026, tm_mon=7, tm_mday=1, ...)
# 格式化
print(time.strftime('%Y-%m-%d %H:%M:%S', t)) # 2026-07-01 22:33:49
print(time.strftime('%Y年%m月%d日', t)) # 2026年07月01日
print(time.strftime('%A %B %d, %Y', t)) # Wednesday July 01, 2026
# 解析
parsed = time.strptime("2026-07-01 22:30:00", "%Y-%m-%d %H:%M:%S")
print(f"解析: {parsed.tm_year}-{parsed.tm_mon:02d}-{parsed.tm_mday:02d}")
strftime 格式化符号速查:
| 符号 | 含义 | 示例 |
|---|---|---|
%Y |
四位年份 | 2026 |
%m |
月份(01-12) | 07 |
%d |
日(01-31) | 01 |
%H |
时(00-23) | 22 |
%M |
分(00-59) | 33 |
%S |
秒(00-59) | 49 |
%A |
星期全名 | Wednesday |
%B |
月份全名 | July |
%a |
星期缩写 | Wed |
%b |
月份缩写 | Jul |
7.2 sleep 延迟
python
import time
print("倒计时:")
for i in range(3, 0, -1):
print(f" {i}...", flush=True)
time.sleep(0.5)
print(" 发射!")
踩坑提示 :
flush=True可以立即刷新输出缓冲区。否则在管道重定向时,输出可能被缓冲直到程序结束。
7.3 系统信息
python
import platform, os, sys
print(f"platform.system() = {platform.system()}") # Linux
print(f"platform.release() = {platform.release()}") # 6.8.0-106-generic
print(f"platform.machine() = {platform.machine()}") # x86_64
print(f"platform.node() = {platform.node()}") # ecs-88e7-0001
print(f"os.name = {os.name}") # posix
print(f"sys.platform = {sys.platform}") # linux
7.4 进程管理
python
import os, subprocess
# 进程信息
print(f"os.getpid() = {os.getpid()}") # 7965 (当前PID)
print(f"os.getppid() = {os.getppid()}") # 7650 (父PID)
# 执行系统命令
result = subprocess.run(["whoami"], capture_output=True, text=True)
print(f"whoami: {result.stdout.strip()}") # root
result = subprocess.run(["hostname"], capture_output=True, text=True)
print(f"hostname: {result.stdout.strip()}") # ecs-88e7-0001
result = subprocess.run(["uname", "-a"], capture_output=True, text=True)
print(f"uname: {result.stdout.strip()}")
# Linux ecs-88e7-0001 6.8.0-106-generic ... x86_64 GNU/Linux
result = subprocess.run(["nproc"], capture_output=True, text=True)
print(f"nproc: {result.stdout.strip()} (CPU核心数)") # 8
result = subprocess.run(["free", "-h"], capture_output=True, text=True)
print("内存:")
print(result.stdout)
whoami: root
hostname: ecs-88e7-0001
uname -a: Linux ecs-88e7-0001 6.8.0-106-generic #106-Ubuntu SMP PREEMPT_DYNAMIC
Fri Mar 6 07:58:08 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
nproc: 8 (CPU核心数)
内存:
total used free shared buff/cache available
Mem: 14Gi 563Mi 13Gi 2.5Mi 887Mi 14Gi
Swap: 0B 0B 0B
7.5 环境变量
python
import os
for var in ["PATH", "HOME", "USER", "SHELL", "LANG"]:
val = os.getenv(var, "(未设置)")
print(f" {var:10s} = {val}")
PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:...
HOME = /root
USER = root
SHELL = /bin/bash
LANG = en_US.UTF-8
7.6 文件操作
python
# 写文件
with open("/root/test_file.txt", 'w') as f:
f.write("Hello, Python!\n")
f.write("这是第二行\n")
f.write("12345\n")
# 读文件
with open("/root/test_file.txt", 'r') as f:
content = f.read()
print(content)
# 逐行读取
with open("/root/test_file.txt", 'r') as f:
for i, line in enumerate(f, 1):
print(f" 行{i}: {line.rstrip()}")
# 文件信息
import os
stat = os.stat("/root/test_file.txt")
print(f"文件大小: {stat.st_size} 字节")
print(f"文件权限: {oct(stat.st_mode)[-3:]}")
Hello, Python!
这是第二行
12345
行1: Hello, Python!
行2: 这是第二行
行3: 12345
文件大小: 37 字节
文件权限: 644
文件打开模式:
| 模式 | 含义 | 文件不存在时 |
|---|---|---|
r |
只读(默认) | 报错 |
w |
只写(覆盖) | 创建 |
a |
追加 | 创建 |
r+ |
读写 | 报错 |
w+ |
读写(覆盖) | 创建 |
b |
二进制模式 | --- |
t |
文本模式(默认) | --- |
7.7 os.path 路径操作
python
import os
path = "/root/hello.py"
print(f"basename('{path}') = {os.path.basename(path)}") # hello.py
print(f"dirname('{path}') = {os.path.dirname(path)}") # /root
print(f"splitext('{path}') = {os.path.splitext(path)}") # ('/root/hello', '.py')
print(f"exists('{path}') = {os.path.exists(path)}") # True
print(f"isfile('{path}') = {os.path.isfile(path)}") # True
print(f"abspath('hello.py') = {os.path.abspath('hello.py')}") # /root/hello.py
7.8 sys.path --- 模块搜索路径
python
import sys
for i, p in enumerate(sys.path):
print(f" [{i}] {p}")
[0] /root # 当前目录
[1] /usr/lib/python312.zip # 标准库(zip)
[2] /usr/lib/python3.12 # 标准库
[3] /usr/lib/python3.12/lib-dynload # C扩展
[4] /usr/local/lib/python3.12/dist-packages # 第三方包
[5] /usr/lib/python3/dist-packages # 系统包
模块搜索顺序 :
sys.path列表从前往后搜索。当前目录(''或脚本所在目录)排在最前,这意味着同名的本地模块会遮蔽标准库模块------注意避免命名冲突。
7.9 ANSI 彩色输出
python
# ANSI 转义码
RED = "\033[91m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
BLUE = "\033[94m"
RESET = "\033[0m"
print(f"{RED}红色文字{RESET}")
print(f"{GREEN}绿色文字{RESET}")
print(f"{YELLOW}黄色文字{RESET}")
print(f"{BLUE}蓝色文字{RESET}")
ANSI 颜色码速查:
| 代码 | 颜色 | 前景色 | 背景色 |
|---|---|---|---|
| 90 | 黑(暗) | \033[90m |
\033[40m |
| 91 | 红 | \033[91m |
\033[41m |
| 92 | 绿 | \033[92m |
\033[42m |
| 93 | 黄 | \033[93m |
\033[43m |
| 94 | 蓝 | \033[94m |
\033[44m |
| 95 | 紫 | \033[95m |
\033[45m |
| 96 | 青 | \033[96m |
\033[46m |
| 0 | 重置 | \033[0m |
--- |
7.10 大字报时效果
python
import time
current_time = time.strftime("%H:%M:%S")
print(f" +{'='*20}+")
print(f" | {'':^18} |")
print(f" | {current_time:^18} |")
print(f" | {'':^18} |")
print(f" +{'='*20}+")
+====================+
| |
| 22:33:51 |
| |
+====================+
在终端中可配合
figlet(大字体)和lolcat(彩虹色)实现更炫酷的效果:
bash$ apt install figlet lolcat $ watch -n 1 'date +"%T" | figlet | lolcat'
7.11 timeit 性能计时
python
import timeit
# 字符串拼接对比
t_join = timeit.timeit("''.join(['a','b','c'])", number=100000)
t_concat = timeit.timeit("'a'+'b'+'c'", number=100000)
print(f"join: {t_join:.4f}s (100000次)")
print(f"concat: {t_concat:.4f}s (100000次)")
# join比concat 慢 7.80x (少量字符串直接拼接更快)
# 列表推导式 vs for循环
t_compr = timeit.timeit("[x**2 for x in range(100)]", number=10000)
t_for = timeit.timeit("""
lst = []
for x in range(100):
lst.append(x**2)
""", number=10000)
print(f"推导式: {t_compr:.4f}s")
print(f"for循环: {t_for:.4f}s")
print(f"推导式快 {t_for/t_compr:.2f}x")
join: 0.0073s (100000次)
concat: 0.0009s (100000次)
join比concat 慢 7.80x
推导式: 0.0299s (10000次)
for循环: 0.0354s (10000次)
推导式快 1.18x
踩坑提示 :
join在拼接大量 字符串时优势明显(避免多次内存分配),但拼接少量 字符串时,+的函数调用开销更小,反而更快。选择取决于场景。
附录:服务器目录结构
实战结束后服务器 /root 目录:
/root/
├── hello.py # 第一章:Hello World
├── debug_demo.py # 第一章:pdb调试示例
├── ch2.py # 第二章:变量与数据类型
├── ch3.py # 第三章:容器类型
├── ch4.py # 第四章:条件分支
├── ch5.py # 第五章:循环结构
├── ch6.py # 第六章:函数
└── ch7.py # 第七章:系统环境
总结
本文在华为云 FlexusX 服务器(Ubuntu 24.04 + Python 3.12.3)上完成了 Python 从零开始的全部核心知识点实战,覆盖 7 大模块:
| 章节 | 核心知识点 | 关键函数/语法 |
|---|---|---|
| 先跑起来 | print、文件运行、异常处理、pdb调试 | print(), try/except, pdb |
| 变量与数据类型 | ord/chr、int/str、id、关键字、random | ord(), chr(), type(), id() |
| 容器类型 | list/tuple/set/dict、切片、推导式、拷贝 | append(), sorted(), copy.deepcopy() |
| 条件分支 | if/elif/else、比较、逻辑、三目、in | if, and/or/not, is, == |
| 循环结构 | while/for、break/continue、enumerate/zip | range(), enumerate(), zip() |
| 函数 | 参数、作用域、递归、lambda、装饰器 | def, global, lru_cache, lambda |
| 系统环境 | time、文件操作、进程、路径、ANSI彩色 | time.strftime(), os.path, subprocess |
核心踩坑总结:
- 可变默认参数 :
def f(lst=[])会在多次调用间共享列表,用lst=None代替 - 浅拷贝陷阱 :
copy.copy()只复制外层,嵌套列表仍共享,需copy.deepcopy() - is vs == :
is比较内存地址,==比较值;小整数缓存[-5, 256] - 短路求值 :
and左操作数为 False 时右侧不执行,or左操作数为 True 时右侧不执行 - 推导式性能:列表推导式比 for+append 快约 1.2~1.5 倍
- join vs + :少量字符串用
+更快,大量字符串用join更高效
服务器信息 :ecs-88e7-0001 | 139.9.128.210 | 8vCPU 16GiB | Ubuntu 24.04.4 LTS | Python 3.12.3
创建时间:2026/07/01 22:25 GMT+8 | 华为云 FlexusX 可用区7