变量、常量和注释
约 1427 字大约 5 分钟
2025-04-03
Python 是动态强类型语言:变量不预声明、随时换类型,但底层一切皆对象。这一节理清命名规则、常量约定、注释写法,再讲三个进阶习惯:多重赋值、类型注解、海象运算符。
- 命名规则与保留字
- 常量是约定不是强制
- 单行/多行注释与 docstring
- 多重赋值与序列解包
- 类型注解(PEP 484)
- 海象运算符 :=
- 1试 1a = 1(数字开头)、class = 1(关键字)、中文名 = 1(非 ASCII 可以,但不推荐),看哪些报错。
- 2用 a, b = 1, 2 一行赋两个值,再用 a, b = b, a 交换 —— 这是 Python 最优雅的写法之一。
- 3把 a: int = 1 这种类型注解写一遍,跑 print(__annotations__) 看注解被存到哪里。
- 4在 if (n := len(data)) > 10 里用一次海象运算符(3.8+),体会“一边算一边判”。
- 5给一个函数写三引号 docstring,再用 help(func) 调出来,理解文档字符串不是注释。
变量
Python 是一个动态强类型的编程语言,Python 基本数据类型不需要装箱拆箱操作,Python 一切皆对象。
变量名(其他 Python 中的标识符如函数名、类名、模块名等也要遵循这个规则)命名规范:
变量名只能由数字、字母和下划线组成
不能以数字开头
禁止使用 Python 中的关键字(原则上也不能使用 Python 内置函数和标准库)作为变量名
变量名要具有可描述性
变量名要区分大小写
不能使用中文和拼音
推荐写法:
- 类名使用全首字母大写驼峰体(CamelCase)
- 对象名使用全小写下划线(snake_case)
Python 中的关键字:
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield非关键字,但有特殊语法含义(不全,后续自行补充):
# 软关键字
case match type _ ...
# 特殊变量
__name__ __file__ __doc__ __dict__Python 变量无需提前声明,也无需声明类型,可直接使用,后续也可赋值为其他类型:
python playground
a = 1
print(a)
a = 'tom'
print(a)常量
在 Python 中,没有严格意义的常量。大家约定俗成的是,变量名全部是大写字母的变量就被视为常量,在程序执行过程中一般不会被轻易修改。例如:
ID = 110120130140150
ID = '123123213' # 不建议在程序执行过程中随意修改注释
注释的作用是给一些晦涩难懂的代码进行标注或解释。被注释的代码不会被执行。
Python 中的注释分为两种:
- 单行注释(当行注释):用
#开头表示 - 多行注释:用三对
“ ”或‘ ’包裹,可以换行
具体示例为:
# 这个是单行注释的示例
# 换行之后要在开头加一个 #
"""
窗前明月光,
玻璃好上霜.
要不及时擦,
整不好就脏.
"""严格说,写在函数、类、模块开头的三引号字符串叫 docstring(文档字符串),它会被 Python 当作 __doc__ 属性保留,可以被 help() 调出来。普通的多行注释只是“没人接收的字符串字面量”,惯例上仍推荐用多个 # 写。
多重赋值与序列解包
Python 支持一次赋多个变量,这在交换、解构返回值时非常方便:
python playground
# 同时赋多个值
a, b, c = 1, 2, 3
print(a, b, c)
# 交换两个变量,不需要临时变量
a, b = b, a
print(a, b)
# 解构一个序列
name, age = ['alice', 18]
print(name, age)
# 用 * 收集剩余元素
first, *rest = [1, 2, 3, 4]
print(first, rest) # 1 [2, 3, 4]类型注解(Type Hints)
从 Python 3.5(PEP 484)开始支持类型注解。注解只是给读代码的人和 IDE/类型检查器看的,运行时不会强制:
python playground
age: int = 18
name: str = 'alice'
def greet(name: str, age: int = 18) -> str:
return f'hello {name}, age {age}'
print(greet('bob'))
print(__annotations__) # 模块级注解会被保存到这里注解不会阻止你赋值成其他类型(age = 'eighteen' 也能跑),但配合 mypy、pyright 这类静态检查器就能提前发现类型错误,是中大型项目的标配。
海象运算符 :=
Python 3.8 引入赋值表达式(PEP 572),俗称海象运算符。它的特点是“在表达式内部完成赋值”,省掉一次额外的变量声明:
python playground
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 传统写法:算一次长度,再判断,再用
n = len(data)
if n > 5:
print(f'有 {n} 个元素')
# 海象写法:长度算一次、判断、复用
if (n := len(data)) > 5:
print(f'有 {n} 个元素')海象常见于 while 循环读取数据和列表推导式中的中间结果复用。但要克制——为了省一行而牺牲可读性不划算。
- 变量无需声明、可随时换类型;命名只能字母/数字/下划线、不能数字开头、不能用关键字。
- Python 没有真正的常量,全大写只是“请别改我”的社区约定。
- a, b = b, a 一行交换;first, *rest = lst 用星号收尾,是地道的解包写法。
- 类型注解只供工具消费,运行时不强制;模块级注解可在 __annotations__ 里看。
- 海象运算符 :=(3.8+)能在表达式里赋值,少写一行,但别滥用,可读性优先。
版权所有
版权归属:Shuo Liu
