Day05 · 语法基础
Day05 · 语法基础
阶段:阶段一 · 核心基础 | 前置:Day04 | 技术基准:Python 3.15.0
学习目标
- 掌握标识符(Identifier)的命名规则与常用命名风格(snake_case / CamelCase)
- 认识 Python 的保留字(关键字)表,会用
keyword模块查询 - 理解变量的动态类型本质,知道"常量"在 Python 里只是命名约定
- 分清逻辑行与物理行,会用续行符
\和括号内隐式续行 - 牢记 Python 的缩进规则,避免 Tab/空格混用报错
一、标识符(Identifier)
标识符就是程序员自己取的名字:变量名、函数名、类名、模块名……程序里凡是你给它起名字的地方,都要遵守命名规则。
1.1、命名规则
在 Python 3 中,标识符由以下字符组成(兼容 ASCII 与 Unicode):
- 可以包含字母(a-z、A-Z)、数字(0-9)、下划线(_)。
- 数字不能开头:
name1合法,1name非法。 - 不能是 Python 的保留字(关键字),如
if、for、class。 - 区分大小写:
name、Name、NAME是三个不同的名字。 - 长度不限,但建议见名知意。
- 下划线开头有特殊含义(后面讲类时细讲):单下划线
_foo表示"内部使用",双下划线__foo会触发名称修饰,双下划线开头结尾的__foo__是特殊方法(如__init__)。
# 合法标识符
user_name = "小嘉"
_name = "内部变量"
name2 = "带数字"
PI = 3.14159
# 非法标识符(会报 SyntaxError,下面故意注释掉)
# 2name = "数字开头" # SyntaxError
# my-name = "横杠" # 横杠会被当成减号
# class = 10 # class 是关键字
小嘉提醒:Python 3 甚至允许用中文、日文等 Unicode 字符做标识符(PEP 3131),比如
名字 = "小嘉",技术上能跑。但实际工程中不建议,统一用英文命名最稳妥,跨团队、跨工具链都不会出问题。
1.2、命名风格
业界常见两种风格,Python 社区有明确约定(PEP 8):
| 风格 | 写法 | 适用对象 | 例子 |
|---|---|---|---|
| 蛇形命名(snake_case) | 全小写、下划线连接 | 变量名、函数名、模块名 | user_name、send_buffer |
| 大驼峰(PascalCase) | 每个单词首字母大写 | 类名 | UserInfo、Person |
| 全大写 | 全大写下划线 | 常量(约定) | MAX_SIZE、PI |
# 推荐:变量/函数用 snake_case
user_age = 18
def get_user_name():
pass
# 推荐:类用大驼峰
class StudentInfo:
pass
# 约定:常量全大写(只是约定,技术上仍可改)
MAX_CONNECTIONS = 100
二、保留字(关键字)
Python 有一批保留字(关键字),它们有特殊语法含义,不能再拿来当变量名。可以用标准库 keyword 模块查看当前版本的完整列表:
import keyword
print(keyword.kwlist) # 列出所有关键字
print(len(keyword.kwlist)) # 关键字个数
print(keyword.iskeyword("if")) # True
print(keyword.iskeyword("name")) # False
输出(节选,Python 3.15):
['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']
版本差异提示:Python 2 的关键字里没有
False、None、True、nonlocal,且exec是语句而非函数;Python 3 中True/False/None是关键字。这些 Python 2 写法(print "hi"、exec语句)在 3.15 中已移除。
如果你不小心用关键字当变量名,解释器会立刻报错:
# 下面这句会直接报 SyntaxError,故意注释掉
# class = "计算机"
三、变量与常量
3.1、变量:名字到对象的绑定
Python 里的变量和 C/Java 不同——它不需要声明类型。= 不是"把值装进盒子",而是"把名字绑定(bind)到一个对象上"。
# Author: XiaoJia
x = 10 # 名字 x 绑定到整数对象 10
print(x) # 10
x = "hello" # 同一个名字 x,改绑到字符串对象
print(x) # hello
这就是动态类型(Dynamic Typing):变量本身没有固定类型,类型跟着它当前绑定的对象走。Day06 会用 type() 验证这一点。
# 多变量赋值
a = b = c = 1 # 链式赋值:三个名字都绑定到 1
print(a, b, c) # 1 1 1
d, e = 1, 2 # 序列解包赋值
print(d, e) # 1 2
d, e = e, d # 一行交换两个变量,不需要临时变量
print(d, e) # 2 1
3.2、初始化:用之前必须先绑定
变量在使用前必须先赋值,否则报 NameError:
# print(age) # NameError: name 'age' is not defined
age = 18 # 先初始化
print(age) # 18
3.3、常量:Python 没有真正的常量
Python 语法层面没有常量——任何变量都能重新赋值。所谓"常量"只是社区约定:用全大写下划线命名,提醒别人"这个值别改"。
为什么 Python 不做真正的常量?因为它信奉"我们都是成年人"(We are all consenting adults)——语言把规则降到最少,靠团队自觉和代码审查来保证约定,而不是用语法锁死。真要强制只读,可以用类/枚举封装(Day20 讲
enum),日常不必。
PI = 3.14159265 # 约定:常量,别去改它
MAX_SIZE = 1024
# 技术上你写 PI = 3 也能跑,但请尊重约定
四、逻辑行与物理行
这是 Python 语法里一个容易被忽略、却很实用的概念。
- 物理行(Physical Line):你在编辑器里看到的一行,以回车结束。
- 逻辑行(Logical Line):Python 解释器眼里的一条完整语句。
通常"一个物理行 = 一个逻辑行"。但有例外。
4.1、一行写多条语句(分号)
用分号 ; 可以在一个物理行里塞多条逻辑语句:
i = 5; print(i) # 两个语句挤在一行
虽然合法,但 PEP 8 不推荐,除非写一次性的小脚本。一条语句占一行更清晰。
4.2、一条语句写多行(续行符)
一行代码太长时,用反斜杠 \ 结尾续行,叫显式续行:
# Author: XiaoJia
total = 1 + 2 + 3 + \
4 + 5 + 6 + \
7 + 8 + 9
print(total) # 45
4.3、括号内自动续行(推荐)
更推荐的做法:只要在 ()、[]、{} 内部,换行不需要反斜杠,叫隐式续行:
nums = [1, 2, 3,
4, 5, 6,
7, 8, 9]
print(nums) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
message = ("这是一段很长的话,"
"放在括号里可以自然换行,"
"Python 会自动把它们拼起来")
print(message)
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
这是一段很长的话,放在括号里可以自然换行,Python 会自动把它们拼起来
五、缩进规则:Python 的灵魂
Python 不用 {} 表示代码块,而是用缩进(Indentation)。这是 Python 最有辨识度的语法特征,也是新手最容易踩的坑。
5.1、四级空格
官方约定(PEP 8):每级缩进用 4 个空格。
age = 18
if age >= 18:
print("成年人") # 这一行缩进了 4 格,属于 if 内部
print("可以上网吧") # 同样属于 if 内部
print("这一行不缩进,不属于 if")
5.2、缩进不一致会报错
同一代码块的缩进量必须一致。混用 Tab 和空格,在 Python 3 中会直接报错:
IndentationError: unindent does not match any outer indentation level
小嘉提醒:在编辑器(VSCode / PyCharm / IDLE)里把 Tab 设置成自动展开成 4 个空格,就能避免这个坑。IDLE 默认就是 4 空格,放心用。
# 正确:同一块内缩进一致
for i in range(2):
print(i)
print("同一级")
# 下面这种缩进混乱会报 IndentationError(故意注释)
# for i in range(2):
# print(i) # 2 格
# print("错位") # 4 格 → 报错
5.3、缩进的实战建议
实际写代码时,IDE 会帮你自动缩进:上一行以冒号 : 结尾(如 if、for、def),回车后光标自动进到下一级。你要做的是保持同一级对齐,不要手动敲一堆空格。
# 对的:函数体整体缩进 4 格,循环体再缩进 4 格(共 8 格)
def show():
for i in range(2):
print(i)
print("同一级")
print("回到函数体一级") # 取消缩进,回到 def 下一级
小嘉提醒:在 VSCode/PyCharm 里把"Tab 键插入空格"打开(IDLE 默认就是 4 空格),这样按 Tab 和按空格效果一致,永远不会出现 Tab/空格混用的
IndentationError。
练习题
- 判断下列哪些是合法标识符,并说明理由:
user-name、_secret、2nd_name、年龄、class、myVar2。 - 用
keyword.kwlist打印当前 Python 3.15 的全部关键字,数一数有多少个,挑出 5 个你还没见过的。 - 写出符合 PEP 8 的命名:一个表示"学生姓名"的变量、一个表示"最大重试次数"的常量、一个表示学生类的类名。
- 把下面这行过长的代码用"括号内隐式续行"改写成多行:
result = 100 + 200 + 300 + 400 + 500 + 600 + 700。 - 故意写一段缩进混乱(Tab 和空格混用)的代码运行,把报错信息抄下来,再改正确。
- 思考题:为什么 Python 强制用缩进表示代码块,而不像其他语言用
{}?这对代码可读性是好是坏?
小结
- 标识符由字母、数字、下划线组成,数字不开头,区分大小写,不能是关键字;不建议用中文做工程命名。
- 命名约定:变量/函数 snake_case,类 PascalCase,常量全大写(只是约定,非语法强制)。
- 保留字用
keyword.kwlist查询;print在 Python 3 是函数、True/False/None是关键字(Python 2 无此规则,已演进)。 - 变量是"名字到对象的绑定",动态类型可随时换绑;
a, b = b, a一行交换;使用前必须先初始化。 - 逻辑行 vs 物理行:分号可一行多句(不推荐);
\显式续行;()/[]/{}内隐式续行(推荐)。 - 缩进即代码块:每级 4 空格,同块缩进必须一致,Tab/空格混用在 Python 3 报
IndentationError。
扩展阅读
- PEP 8(Python 风格指南,必读):https://peps.python.org/pep-0008/
- Python 词法分析(标识符/关键字/缩进官方定义):https://docs.python.org/3/reference/lexical_analysis.html
- 源目录教材参考:《跟小嘉学习Python 程序设计》一、Python 开发环境介绍和搭建.md 第四章 第一~三节(语法基础、变量常量、逻辑行物理行)

浙公网安备 33010602011771号