跳到主要内容

Python 基础语法与对象模型

Python 代码包含表达式和语句:表达式产生值,语句负责赋值、选择执行路径,或定义函数和类。下面的 temperature_c < 0 就是一个表达式,它的结果决定 if 语句执行哪个分支。每个分支中缩进的代码组成一个代码块,引出代码块的那一行以 : 结尾。

temperature_c = 21.5
if temperature_c < 0:
state = "frozen"
else:
state = "liquid"

名称绑定对象

赋值操作本质上是名称绑定(Name Binding),而非声明存储单元或复制值。这意味着多个名称可以指向同一个对象:

first = [1, 2]
second = first
second.append(3)
assert first == [1, 2, 3]

如果需要独立的可变状态,必须显式创建副本,如使用 .copy()、切片或深拷贝。具体操作是否修改原对象,取决于对象类型及其 API 定义。

内置值类型

Python 内置类型大致分为以下几类,它们遵循不同的协议(Protocol):

  • 数值intfloatcomplexbool
  • 文本与二进制strbytesbytearray
  • 序列listtuplerange
  • 映射与集合dictsetfrozenset
  • 空值哨兵None

关键区别在于可变性(Mutability):字符串不可变,列表可变;字典的键必须可哈希(Hashable)。

运算符与比较

  • /:真除法(True Division)
  • //:地板除(Floor Division,向下取整)
  • %:取模(Remainder)

比较时需注意区分值相等身份同一

  • ==:比较值是否相等。
  • is:比较两个变量是否指向内存中的同一个对象。通常仅用于 None 等单例对象。
if result is None:
handle_missing_result()

类型转换是边界

构造函数如 int(text)float(text)str(value) 执行类型转换,且可能抛出异常。切勿假设用户输入或文件内容已符合预期格式,必须做好异常处理:

try:
quantity = int(raw_quantity)
except ValueError as error:
raise ValueError("quantity must be an integer") from error

命名空间与导入

import 语句将模块对象或特定名称绑定到当前命名空间。

from pathlib import Path

config_path = Path("config.json")

最佳实践:优先使用显式导入(Explicit Imports),避免使用 from module import * 通配符导入,以保持代码中名称来源的清晰性和可维护性。

运行代码与检查转换

本组笔记使用 Python 3.10 或更高版本。把代码保存为 example.py,运行 python3 example.py(Windows 可用 py -3 example.py)。交互解释器会自动显示表达式的值;脚本中需用 print 输出。每层缩进使用四个空格,不要混用制表符与空格。字符串外的 # 开始注释;表达式放在圆括号内可跨行书写。

内置数值类型在下面两种运算中采用不同的取整方向:

assert -7 // 3 == -3
assert -7 % 3 == 2
assert -7 == (-7 // 3) * 3 + (-7 % 3)
assert int(-2.9) == -2 # 向零截断
assert int(" 12 ") == 12
assert bool("False") is True

input() 返回文本。int("2.9") 抛出 ValueErrorint(None) 则抛出 TypeError:内容不合法与输入类型不受支持是两种错误。bool(text) 判断字符串是否为空,不会解析 "False" 等单词。Python 整数的精度受内存限制,没有固定的位数上限;二进制浮点数无法精确表示大多数十进制小数,例如 0.1 + 0.2 != 0.3。近似数值比较可用 math.isclose,但容差需按问题选择,不能随意取整来掩盖误差。

名称可以重新绑定到其他类型的对象,但对象的类型决定支持哪些操作:3 + "4" 会抛出 TypeError。在前面的例子之后执行 second = [] 不会改变 first。浅拷贝只分离外层容器,内部可变对象仍可能共享。

参考来源

探索关联打开关联网络