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!"

复合语句

ifwhiledefclass 等复合语句,首行以关键字开始,以冒号 : 结束,后续缩进块为子句:

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']

matchcase 是 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
序列liststr, tuple
集合setfrozenset
映射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))  # 2

Python 内置类型一览

数字类型

类型描述示例可变
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()/()/'')、0False
  • 真值:其他所有
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 += x

range() 用法:

range(101)           # 0..100
range(1, 101)        # 1..100
range(1, 101, 2)     # 1, 3, 5, ... 99
range(100, 0, -2)    # 100, 98, 96, ... 2

while

while True:
    number = int(input('请输入:'))
    if number == answer:
        print('猜对了!')
        break

break / 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():
    pass

return

从函数返回值。未显式 return 时返回 None

def add(a, b):
    return a + b