变量和类型
每个程序都需要记住一些东西。问答游戏需要记住玩家的名字。游戏需要记住当前的分数。天气脚本需要记住你正在查询的城市。Python 为此使用变量:你可以将名字附加到值上,以便在整个程序中使用它们。
player_name = "小明"
score = 0
city = "北京"三行。Python 现在记住了三件事。之后使用这些名字中的任何一个,Python 都会把对应的值返回给你。
存储一个值
= 符号几乎让每个从数学课来的人都摔跟头。在 Python 中,= 不表示"等于"。它意味着将这个值存储在这个名字下。从左到右阅读:
city = "北京"city 得到了 "北京"。你是在告诉 Python:记住 "北京" 并把它标记为 city。
你可以随时替换变量的值。Python 只使用最新的那个:
score = 0
score = 10 # score 现在是 10
score = 15 # score 现在是 15给变量命名
名字由你选择。Python 有一些硬性规则,社区也遵循一些值得从第一天就采用的约定。清晰的名字让代码在几周后仍然可读。晦涩的名字会带来痛苦。
Python 强制执行的规则:
- 只能使用字母、数字和下划线。不能有空格或连字符。
- 必须以字母或下划线开头,不能以数字开头
- 区分大小写:
score、Score和SCORE是三个不同的变量
每个人都遵循的约定(PEP 8):
| 事物 | 风格 | 示例 |
|---|---|---|
| 变量和函数 | snake_case | user_name、total_price |
| 常量 | UPPER_SNAKE_CASE | MAX_RETRIES、BASE_URL |
| 类 | PascalCase | UserAccount、DataLoader |
# 清晰的名字,一眼就能读懂
user_name = "小明"
total_price = 49.99
is_logged_in = True
MAX_RETRIES = 3
# 一个小时内你就会后悔这些
x = "小明"
tp = 49.99
b = True值得早点知道的一个陷阱:不要用 Python 内置名字(如 list、input、type 或 print)来给变量命名。Python 允许这样做,但你会悄无声息地破坏该作用域中剩余部分的内置功能,由此产生的错误很难追踪。
你可以存储什么
Python 有四种类型,你几乎会在每个程序中使用它们。Python 会根据你书写值的方式来判断你指的是哪种类型。你永远不需要显式声明类型。
文本 (str)
任何文本都放在引号内,单引号或双引号都行。引号告诉 Python 你指的是字面字符,而不是变量名。一旦创建,字符串就不能就地修改。字符串章节会介绍你能对它们做的所有事情。
player_name = "小明"
city = "北京"
message = '游戏结束'如果你的文本包含撇号,使用双引号可避免转义:
note = "It's a great day"
note = 'It\'s a great day' # 相同的结果,使用转义整数 (int)
整数不带引号或小数点。Python 称它们为整数。它们可以任意大;Python 会处理任意大的数字,你无需做任何特殊处理。
score = 0
age = 28
population = 8_100_000_000 # 下划线只是为了可读性小数 (float)
任何带小数点的数字都是浮点数。对于大多数计算它们都按预期工作。需要注意的一件事:某些小数值不能在二进制中精确存储,因此你可能会得到一个微小的舍入误差:
price = 4.99
temperature = 36.6
0.1 + 0.2 # 0.30000000000000004对于日常工作,这很少有影响。对于需要精确到分以下的金融计算,Python 有一个 decimal 模块可以正确处理。这在数字章节中介绍。
真或假 (bool)
有些事情就是开或关。Python 为此使用布尔值:只有两个值,True 和 False。它们在这个阶段看起来不起眼,但你程序中的每个条件和分支都依赖于布尔值。
is_logged_in = True
has_errors = FalsePython 在条件中使用某些值时也会将它们视为 False:0、0.0、"" 和 None(Python 的"此处无值")都表现得像 False。其他一切都表现得像 True。这在控制流章节中会变得有用。
检查和转换类型
当你不确定一个值的类型时,type() 会告诉你。要检查一个值是否为特定类型,isinstance() 是更可靠的工具:
print(type("hello")) # <class 'str'>
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type(True)) # <class 'bool'>
isinstance(42, int) # True
isinstance("hi", str) # TruePython 不会自动混合类型。连接字符串和数字会引发 TypeError:
score = 42
print("Your score is " + score) # TypeError
print("Your score is " + str(score)) # 可以工作使用类型名作为函数进行显式转换:
| 调用 | 结果 |
|---|---|
str(42) | "42" |
int(3.9) | 3(截断,不四舍五入) |
float("3.14") | 3.14 |
int("3.14") | ValueError:不能直接将小数字符串转换为 int |
int(float("3.14")) | 3(先转换为 float,然后转换为 int) |
bool(0) / bool("") | False |
实践应用
所有四种类型在一个小脚本中协同工作。输出行使用 f-string 将值嵌入文本:在开头的引号前加 f,并将任何变量用 {} 包裹起来。Python 会用变量的实际值替换它。你将在下一章中正式学习它们。
player_name = "小明"
level = 3
accuracy = 0.94
is_premium = True
print(f"{player_name} is on level {level} with {accuracy:.0%} accuracy.")
print(f"Premium account: {is_premium}")类型很重要,因为 level + 1 可以工作,而 player_name + 1 不行。每个变量恰好保存一种东西;Python 不会悄悄为你混合它们。

