Day05 · 语法基础

Day05 · 语法基础

阶段:阶段一 · 核心基础 | 前置:Day04 | 技术基准:Python 3.15.0

学习目标

  • 掌握标识符(Identifier)的命名规则与常用命名风格(snake_case / CamelCase)
  • 认识 Python 的保留字(关键字)表,会用 keyword 模块查询
  • 理解变量的动态类型本质,知道"常量"在 Python 里只是命名约定
  • 分清逻辑行与物理行,会用续行符 \ 和括号内隐式续行
  • 牢记 Python 的缩进规则,避免 Tab/空格混用报错

一、标识符(Identifier)

标识符就是程序员自己取的名字:变量名、函数名、类名、模块名……程序里凡是你给它起名字的地方,都要遵守命名规则。

1.1、命名规则

在 Python 3 中,标识符由以下字符组成(兼容 ASCII 与 Unicode):

  1. 可以包含字母(a-z、A-Z)、数字(0-9)、下划线(_)。
  2. 数字不能开头:name1 合法,1name 非法。
  3. 不能是 Python 的保留字(关键字),如 if、for、class。
  4. 区分大小写:name、Name、NAME 是三个不同的名字。
  5. 长度不限,但建议见名知意。
  6. 下划线开头有特殊含义(后面讲类时细讲):单下划线 _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,且 print、exec 是语句而非函数;Python 3 中 print 是函数、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。

练习题

  1. 判断下列哪些是合法标识符,并说明理由:user-name、_secret、2nd_name、年龄、class、myVar2。
  2. 用 keyword.kwlist 打印当前 Python 3.15 的全部关键字,数一数有多少个,挑出 5 个你还没见过的。
  3. 写出符合 PEP 8 的命名:一个表示"学生姓名"的变量、一个表示"最大重试次数"的常量、一个表示学生类的类名。
  4. 把下面这行过长的代码用"括号内隐式续行"改写成多行:result = 100 + 200 + 300 + 400 + 500 + 600 + 700。
  5. 故意写一段缩进混乱(Tab 和空格混用)的代码运行,把报错信息抄下来,再改正确。
  6. 思考题:为什么 Python 强制用缩进表示代码块,而不像其他语言用 {}?这对代码可读性是好是坏?

小结

  • 标识符由字母、数字、下划线组成,数字不开头,区分大小写,不能是关键字;不建议用中文做工程命名。
  • 命名约定:变量/函数 snake_case,类 PascalCase,常量全大写(只是约定,非语法强制)。
  • 保留字用 keyword.kwlist 查询;print 在 Python 3 是函数、True/False/None 是关键字(Python 2 无此规则,已演进)。
  • 变量是"名字到对象的绑定",动态类型可随时换绑;a, b = b, a 一行交换;使用前必须先初始化。
  • 逻辑行 vs 物理行:分号可一行多句(不推荐);\ 显式续行;()/[]/{} 内隐式续行(推荐)。
  • 缩进即代码块:每级 4 空格,同块缩进必须一致,Tab/空格混用在 Python 3 报 IndentationError。

扩展阅读

posted @ 2026-10-28 12:03  小嘉游戏  阅读(10)  评论(0)    收藏  举报