Python¶
Python 语法简洁、生态丰富,学习曲线相对平缓,广泛应用于算法竞赛、数据分析、后端开发、机器学习、人工智能等领域。以下是核心知识点:
- 数据结构:列表、元组、字典、集合及其常用操作
- 语法特性:推导式、解包赋值、海象运算符
:=、三元表达式 - 函数与高级特性:装饰器、生成器、上下文管理器、Lambda 表达式
- 面向对象:继承、多态、魔术方法(
__init__、__repr__等) - 模块与包管理:
import机制、__name__入口、虚拟环境 - 工程实践:环境管理(uv)、代码格式化(Ruff)、类型提示(Type Hints)
基础¶
运算符¶
- 整除:Python 中使用
//表示整除,其行为是向下取整(Floor Division,如-5 // 2结果为-3)。- 静态类型语言 (C/C++/Java/Go/Rust):当除数和被除数均为整数类型时,
/会自动执行整数除法。需要特别注意,这些强类型语言的整除采用的是向零截断(Truncation towards zero,如-5 / 2结果为-2),在处理负数时与 Python 有本质区别,是刷题时的经典陷阱。 - 动态类型语言 (JavaScript/PHP):
/运算符默认按浮点数除法计算。要实现整除,JavaScript 中推荐使用Math.trunc(a / b)(向零截断)或Math.floor(a / b)(向下取整,亦可通过(a / b) | 0快速处理);PHP 7+ 则提供了专用的整除函数intdiv(a, b),或直接使用(int)(a / b)进行类型转换。
- 静态类型语言 (C/C++/Java/Go/Rust):当除数和被除数均为整数类型时,
- 幂运算:在数学公式中常用
^表示(注意:在 C、Java、Go、JS 等多数语言中^实际是按位异或运算符)。对于幂运算,这些主流语言通常使用标准库的pow()函数,而 Python 则提供了内置运算符**以及内置函数pow()。- 类型推导:Python 的
**运算符会保留操作数的类型(若两个数都是整型,结果为整型;若有浮点型,结果为浮点型);而math.pow()则始终返回浮点数。 - 快速模幂:内置函数
pow(x, y, z)支持三参数版本,表示对模求幂,即 \((x^y) \pmod z\)(如pow(2, 10000000, 13)等价于(2 ** 10000000) % 13)。该方法底层采用快速幂算法,能有效避免计算超大数时的内存溢出与性能瓶颈,在密码学中极其高效和实用。
- 类型推导:Python 的
- 身份运算符:
is,is not - 成员运算符:
in,not in - 逻辑运算符:
and,or,not,而不是常用的&&,||,!
向下取整 vs 向零截断
在数学和编程中,对于正数,向下取整和向零截断结果完全一致;但对于负数,它们的截断方向截然相反:
- 向下取整 (Floor):往数轴负无穷方向(左边)取整。Python 的
//均为此行为(如-5 // 2结果为-3)。 - 向零截断 (Truncate):往数轴零点方向取整(直接砍掉小数部分)。C/C++/Java/Go/Rust 的整数除法
/以及 JS 的Math.trunc()均为此行为(如-5 / 2结果为-2)。
刷题避坑:在 Python 中模拟 C++ 的二分查找求中点 mid = (low + high) / 2 时,若结果可能为负数,务必使用 int((low + high) / 2) 或 int(total / 2) 来代替 //,否则会因向下取整导致二分查找死循环。
分支结构¶
if、elif、else for while match-case
常用数据结构¶
列表¶
元组¶
字典¶
集合¶
格式化输出¶
与 C 系的 printf()、sprintf() 不同,Python 中具有更加高效的 print(f'{}') 写法。对齐方式如下:
-左对齐+输出的数字带± 符号0宽度不足时补 0,而非空格
Python 与 Go 的 := 对比¶
| Go | Python | |
|---|---|---|
| 官方名称 | 短变量声明 | 赋值表达式 (海象运算符) |
| 主要目的 | 函数内创建新变量 (替代 var) | 在判断/计算中顺便赋值 |
| 是否返回值 | 否 (它是语句) | 是 (它是表达式) |
| 作用域 | 严格限制在当前代码块 {} 内 | 通常会“泄漏”到当前函数或模块 |
与 PHP、JavaScript 不同,Python 中 == 即为严格比较,而非 ===
Python 中的布尔值 True 和 False 也是首字母大写,而不是其他语言中的小写
除 Python 和 Shell 中使用 elif 外,其他主流编程语言如 C、Java、Go、JavaScript 等使用 else if
Python 中默认的编码格式是 ASCII,因此通常在文件开头加入 # -*- coding: UTF-8 -*- 或 # coding=utf-8(注意=两边没有空格)来兼容非英文字符。
# 表示单行注释,""" 表示多行注释
没有 const 常量关键字,通过全大写变量名约定来实现常量
三元运算使用的是 max = a if a > b else b,而非 max = a > b ? a : b
Python 不支持 switch-case,只支持 match-case
拥有高效的推导式 [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
函数定义关键字是 def,而非 function 或 func
就像 Linux 中一切皆文件、Kubernetes 中一切皆资源一样,Python 中一切皆对象。
Python 中只有 for-in 和 while,没有普通的 for
在 Python 中,字符串前用 r 表示原生输出字符串,f 表示格式化输出,可解析字符串中的变量,如 f"Hello, {full_name.title()}!"
Python 中的序列分为:
- 有序
- 列表:可以修改,支持运算
- 元组:不可修改
- 无序
- 字典
- 集合
| 特点 | 查 | 增 | 改 | 删 | 备注 | |
|---|---|---|---|---|---|---|
| 列表 | 有序 | ・.index(value, start, end) 查找元素的索引・ .count() 统计元素出现的次数 |
・.append(value) 末尾整体追加元素・ .extend(value) 末尾逐个追加元素・ .insert(index, value) 在指定位置整体插入元素・ + 拼接列表 |
・根据下标修改; ・通过切片修改; |
・del listname[index] 或 del listname[start : end] 根据索引删除・ .pop(index) 根据索引删除・ .remove(value) 根据元素值删除・ .clear() 清空元素 |
range() 函数的返回值并不直接是列表,而是 range |
| 元组 | 有序、不可变 | ・通过索引 ・通过切片 |
・()・ tuple() |
无 | del tuplename |
当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号 ,,否则 Python 解释器会将它视为字符串。 |
| 字典 | 无序、键值对 | ・dictname[key] 通过索引查询,键不存在时报错・ dictname.get(key[, 键不存在时的默认值]) 键不存在时不报错,可设置默认值・ in 或 not in 查询是否存在值・ for k in dictname.keys(): 或 for k in dictname: 获取所有键(keys() 会返回一个列表)・ for v in dictname.values(): 获取所有值・ for k, v in dictname.items(): 来遍历字典 |
・{}・ dict()・ fromkeys 创建带默认值的字典・ dictname[key] = value 通过键值对添加 |
・dictname[key] = value 通过键值对修改・ update 包含则更新,否则添加 |
・del dictname[key] 根据键删除・ .pop() 删除指定的键值对・ popitem() 移除末尾的一个键值对 |
setdefault 为不存在的 key 设置一个默认值 |
| 集合 | 无序、唯一 | ・遍历读取 | ・.add(value) |
无 | ・.remove() 不存在元素报错・ .discard() 不存在元素不报错・ .clear() |
frozenset 不允许变更元素,set 中变更元素的方法都不支持,不变更元素的方法都支持。 |
推导式¶
- 列表
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]] - 元组
(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]),元组推导式生成的结果是生成器对象,使用for或__next__遍历生成器对象后,原值将被清理 - 字典
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]} - 集合
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
在 Python 中,通过子类名后的括号标注父类来表示继承,如 class SubClass(ParentClass):,这在 PHP、Java、JavaScript 中则是通过 extends 关键字实现。如果子类继承多个父类,父类间通过 , 分隔
在 Python 中,模块名是由文件名来确定的(Java 用反向域名,如 com.example.myapp;PHP 用 namespace,如 MyCompany\MyPackage),但不一定与文件名完全相同(Python 中允许一个文件中放多个类)。当在一个名为 module 的目录下放置一个 __init__.py 的空文件时,module 的整个目录都会成为 Python 包,包内所有文件都被视为包的模块
- 导入整个模块:
import (as alias) - 导入模块特定的函数:
from module_name import function0, function1, function2 (as alias)
以下划线开头的标识符有特殊含义,例如:
- 以单下划线开头的标识符(如
_width),表示不能直接访问的类属性,其无法通过from...import *的方式导入; - 以双下划线开头的标识符(如
__add)表示类的私有成员; - 以双下划线作为开头和结尾的标识符(如
__init__),是专用标识符。
Python 中通过 if __name__ == '__main__': 来指定整个程序的入口点,这里的 __name__ 和 __main__ 只是一个内部变量,前者表示当前模块,后者表示当前模块作为主程序入口,而非导入为一个模块,二者并非要满足相等条件,只是一种声明写法。
Python 的环境管理比较混乱,有 venv、poetry、uv 等,uv 则是目前最流行与方便的工具,不仅具有 Rust 的高效,而且能自动管理虚拟环境,还有 Ruff 生态。 Python 有强大的绘图工具 Matplotlib,数学计算工具 NumPy,游戏制作工具 PyGame。