Python 语法基础
Python 的语法设计围绕一个核心理念:代码即文档。缩进定义结构,类型不需声明,高级数据结构内置在语言中。
简介
Python 是一种解释型语言,无需编译和链接。相比 C/C++/Java,Python 代码通常短很多,原因有三:
- 高级数据类型允许在单一语句中表述复杂操作;
- 使用缩进而非括号实现代码块分组;
- 无需预声明变量或参数。
Python 解释器易于扩展,使用 C 或 C++ 即可为 Python 扩展新功能和数据类型。
编码、注释与缩进
编码
源码文件默认编码为 UTF-8。如需其他编码,在文件第一行声明:
# -*- coding: encoding -*-注释
# 单行注释
"""
多行注释
三个引号开头,三个引号结尾
"""缩进
Python 使用缩进表示代码块,不使用大括号。同一代码块的缩进空格数必须一致:
if True:
print("True")
else:
print("False")行语句
- 多行语句使用反斜杠
\续行 - 同一行多条语句用分号
;分隔 - 在
[]、{}、()中的多行语句不需要\ - 相邻字符串自动拼接
total = item_one + \
item_two + \
item_three
total = ['item_one', 'item_two',
'item_three', 'item_four']
s = "hello" "world" "!" # "helloworld!"复合语句
if、while、def、class 等复合语句,首行以关键字开始,以冒号 : 结束,后续缩进块为子句:
if expression:
suite
elif expression:
suite
else:
suite关键字与命名
关键字
import keyword
print(keyword.kwlist)
# ['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']match 和 case 是 3.10+ 新增的软关键字——在特定上下文中有特殊含义,但可以作为变量名使用。
命名规则
硬性规则:
- 由字母(Unicode)、数字和下划线组成,数字不能开头
- 大小写敏感
- 不能与关键字和系统保留字冲突
PEP 8 惯例:
- 小写字母 + 下划线分隔
- 受保护的实例属性:单下划线开头
_protected - 私有实例属性:双下划线开头
__private
对象与类型
**在 Python 中,一切皆对象。**变量不是容器,是绑定到对象上的标签(reference)。
x = 123 # x 绑定到 int 对象
print(type(x)) # <class 'int'>
x = 'hello' # x 重新绑定到 str 对象
print(type(x)) # <class 'str'>两个关键内置函数:
id(obj)— 获取对象的唯一标识(内存地址)type(obj)— 获取对象的类型
可变与不可变
| 类别 | 可变 | 不可变 |
|---|---|---|
| 数字 | — | int, float, complex |
| 序列 | list | str, tuple |
| 集合 | set | frozenset |
| 映射 | dict | — |
不可变对象的”修改”实际上是创建新对象:
x = 1
print(id(x)) # 原来的 id
x = x + 1
print(id(x)) # id 变了——新对象可变对象原地修改:
lst = [1, 2, 3]
print(id(lst))
lst.append(4)
print(id(lst)) # id 不变——同一个对象引用计数
Python 通过引用计数管理内存:每个对象记录有多少变量引用它。引用计数归零时被垃圾收集器回收。
import sys
a = []
print(sys.getrefcount(a)) # 2(a + getrefcount 参数)
b = a
print(sys.getrefcount(a)) # 3
b = None
print(sys.getrefcount(a)) # 2Python 内置类型一览
数字类型
| 类型 | 描述 | 示例 | 可变 |
|---|---|---|---|
| int | 整数,任意精度 | 123, -456 | 不可变 |
| float | 浮点数(双精度) | 3.14, 9.0 | 不可变 |
| complex | 复数 | 1+2j | 不可变 |
| bool | 布尔值 | True, False | 不可变 |
序列类型
| 类型 | 描述 | 示例 | 可变 |
|---|---|---|---|
| str | 字符串 | 'hello', "world" | 不可变 |
| list | 列表,有序可变 | [1, 'two', 3.0] | 可变 |
| tuple | 元组,有序不可变 | (1, 'two', 3.0) | 不可变 |
集合类型
| 类型 | 描述 | 示例 | 可变 |
|---|---|---|---|
| set | 无序不重复 | {1, 'two', 3.0} | 可变 |
| frozenset | 不可变集合 | frozenset({1, 2}) | 不可变 |
映射类型
| 类型 | 描述 | 示例 | 可变 |
|---|---|---|---|
| dict | 键值对集合 | {'name': 'John', 'age': 25} | 可变 |
特殊类型
| 类型 | 含义 | 示例 |
|---|---|---|
| NoneType | 空值 | None |
| EllipsisType | 省略(切片/NumPy) | ... |
| NotImplementedType | 未实现的方法 | NotImplemented |
二进制类型
| 类型 | 描述 | 可变 |
|---|---|---|
| bytes | 不可变字节序列 | 不可变 |
| bytearray | 可变字节序列 | 可变 |
| memoryview | 内存视图 | 依对象 |
类型转换
| 函数 | 说明 |
|---|---|
int(x [,base]) | 转换为整数 |
float(x) | 转换为浮点数 |
complex(real [,imag]) | 创建复数 |
str(x) | 转换为字符串 |
repr(x) | 转换为表达式字符串 |
eval(str) | 求值字符串中的 Python 表达式 |
tuple(s) | 序列转元组 |
list(s) | 序列转列表 |
set(s) | 转换为可变集合 |
dict(d) | 从 (key, value) 序列创建字典 |
frozenset(s) | 转换为不可变集合 |
chr(x) / ord(x) | 整数↔字符 |
hex(x) / oct(x) | 整数 → 十六进制/八进制字符串 |
x = "123"
x = int(x) # 123
x = float(x) # 123.0运算符
优先级从高到低:
| 运算符 | 描述 |
|---|---|
() [] [:] | 调用、下标、切片 |
** | 指数 |
~ + - | 按位取反、正负号 |
* / % // | 乘、除、模、整除 |
+ - | 加、减 |
>> << | 位移 |
& | 按位与 |
^ | | 异或、或 |
<= < > >= | 比较 |
== != | 等于、不等于 |
is is not | 身份比较 |
in not in | 成员测试 |
not or and | 逻辑运算 |
不确定优先级时,使用括号确保执行顺序。
a, b = 10, 20
a + b # 30
a ** 2 # 100
a % 3 # 1
a > b # False
a == b # False
'World' in 'Hello World' # True条件语句
if / elif / else
判断的值分为真值和假值:
- 假值:
None、空容器([]/{}/set()/()/'')、0、False - 真值:其他所有
x = int(input("Please enter an integer: "))
if x < 0:
print('Negative')
elif x == 0:
print('Zero')
else:
print('Positive')match (Python 3.10+)
模式匹配,类似其他语言的 switch,但更强大:
def http_error(status):
match status:
case 400:
return "Bad request"
case 401 | 403 | 404:
return "Not allowed"
case 418:
return "I'm a teapot"
case _: # 通配符,必定匹配
return "Something's wrong"循环语句
for
Python 的 for 迭代任意序列,而非算术递增:
sum = 0
for x in range(101):
sum += xrange() 用法:
range(101) # 0..100
range(1, 101) # 1..100
range(1, 101, 2) # 1, 3, 5, ... 99
range(100, 0, -2) # 100, 98, 96, ... 2while
while True:
number = int(input('请输入:'))
if number == answer:
print('猜对了!')
breakbreak / continue / else
break— 完全跳出循环continue— 跳过当前迭代,进入下一轮else— 循环正常结束(未触发 break)时执行:
for i in range(5):
if i == 10:
break
else:
print("循环正常完成") # 会打印,因为没有 break异常语句
异常处理的基础语法:
try:
result = a / b
except ZeroDivisionError:
print("除数不能为零")
except (TypeError, ValueError) as e:
print(f"类型或值错误:{e}")
else:
print(f"结果:{result}")
finally:
print("始终执行")raise 用于主动抛出异常;assert 用于调试断言。详细的异常层级、自定义异常、异常链和 with 上下文管理器见 05 Python 异常处理与资源。
其他语句
assert
调试断言,条件为假时抛出 AssertionError。使用 -O 优化模式时全局禁用。
assert x > 0, f"x 应为正数,实际为 {x}"pass
空语句,占位用:
def not_implemented_yet():
passreturn
从函数返回值。未显式 return 时返回 None:
def add(a, b):
return a + b