跳转至

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、Java、Go、JS 等多数语言中 ^ 实际是按位异或运算符)。对于幂运算,这些主流语言通常使用标准库的 pow() 函数,而 Python 则提供了内置运算符 ** 以及内置函数 pow()
    • 类型推导:Python 的 ** 运算符会保留操作数的类型(若两个数都是整型,结果为整型;若有浮点型,结果为浮点型);而 math.pow()始终返回浮点数
    • 快速模幂:内置函数 pow(x, y, z) 支持三参数版本,表示对模求幂,即 \((x^y) \pmod z\)(如 pow(2, 10000000, 13) 等价于 (2 ** 10000000) % 13)。该方法底层采用快速幂算法,能有效避免计算超大数时的内存溢出与性能瓶颈,在密码学中极其高效和实用。
  • 身份运算符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 中的布尔值 TrueFalse 也是首字母大写,而不是其他语言中的小写

除 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,而非 functionfunc

就像 Linux 中一切皆文件、Kubernetes 中一切皆资源一样,Python 中一切皆对象。

Python 中只有 for-inwhile,没有普通的 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[, 键不存在时的默认值]) 键不存在时不报错,可设置默认值
innot 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__ 只是一个内部变量,前者表示当前模块,后者表示当前模块作为主程序入口,而非导入为一个模块,二者并非要满足相等条件,只是一种声明写法。

if __name__ == '__main__':
    print_hi('PyCharm')

Python 的环境管理比较混乱,有 venv、poetry、uv 等,uv 则是目前最流行与方便的工具,不仅具有 Rust 的高效,而且能自动管理虚拟环境,还有 Ruff 生态。 Python 有强大的绘图工具 Matplotlib,数学计算工具 NumPy,游戏制作工具 PyGame。

评论