变量与类型
每个程序都需要记住一些东西。一个问答游戏需要记住玩家的名字。一个游戏需要记住当前得分。一个天气脚本需要记住你要查询的城市。Python 用变量来做这件事:给值起个名字,这样你就能在整个程序中反复使用它。
player_name = "Alice"
score = 0
city = "Tokyo"三行代码,Python 现在记住了三件事。对每一行,Python 会先算出右边的值,再把它存到左边这个名字下面。之后用到这个名字时,Python 就会把这个值还给你。
存储一个值
= 符号几乎会让每个从数学课过来的人栽跟头。在 Python 里,= 不代表"等于"。它的意思是**把这个值存到这个名字下面**:
city = "Tokyo"city 得到了 "Tokyo"。你是在告诉 Python:记住 "Tokyo",并给它贴上标签 city。
你可以随时替换一个变量的值。Python 会用最新的那个:
score = 0
score = 10 # score 现在是 10
score = 15 # score 现在是 15= 不是数学课上的"等于",它的意思是"把这个值存到这个名字下面"。你想改就改,Python 只记得最新的那个。不用声明,不用准备工作,你起个名字它就存在了。我在这上面纠结了太久。 给变量起名字
名字由你来定。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 = "Alice"
total_price = 49.99
is_logged_in = True
MAX_RETRIES = 3
# 用不到一小时你就会后悔这样起名
x = "Alice"
tp = 49.99
b = True有一个坑值得早点知道:不要把变量名起成 Python 内置的名字,比如 list、input、type 或 print。Python 允许你这么做,但这会悄无声息地让该作用域后面的代码都用不了这个内置功能了,出的错还很难追查。
snake_case 就万无一失。我踩过的一个新手坑:别把变量叫 list 或 print。Python 允许你这么做,然后后面所有东西都会莫名其妙地出问题,还没有任何警告。 你能存储什么
Python 有四种你几乎在每个程序中都会用到的类型。Python 会根据你写值的方式判断你指的是哪种类型。你从来不需要显式声明类型。
文本(str)
任何文本都放在引号里,单引号或双引号都行。引号告诉 Python 你说的是字面上的字符,而不是变量名。字符串一旦创建,就不能就地修改。字符串一章会讲到关于字符串的所有操作。
player_name = "Alice"
city = "Tokyo"
message = 'Game over'如果你的文本里包含一个撇号,用双引号可以避免转义:
note = "It's a great day"
note = 'It\'s a great day' # 结果相同,用了转义字符整数(int)
整数不带引号也不带小数点。Python 把它们叫做整数(integer)。它们可以大到你需要的任何程度;Python 处理任意大的数字,不需要你做任何特别的事。
score = 0
age = 28
population = 8_100_000_000 # 下划线只是为了方便阅读8_100_000_000 里的下划线只是为了让你读得清楚。 小数(float)
任何带小数点的数字都是浮点数(float)。对大多数计算来说,它们的表现和你预期的一样。有一点要知道:有些小数值无法在二进制中精确存储,所以你可能会碰到微小的舍入误差:
price = 4.99
temperature = 36.6
0.1 + 0.2 # 0.30000000000000004对于日常工作来说,这几乎不重要。对于财务计算这种连一分钱的零头都要计较的场景,Python 有一个 decimal 模块能正确处理这个问题。这在数字一章里有讲。
0.1 + 0.2 得到 0.30000000000000004。不是 bug,这就是二进制的特性。要算钱就用 decimal.Decimal。 真或假(bool)
有些东西是开或关的。Python 用布尔值来表示这种情况:只有两个值,True 和 False。现阶段它们看起来不起眼,但你程序里的每一个条件和分支都靠布尔值运行。
is_logged_in = True
has_errors = FalsePython 在条件判断中还会把某些值当成 False 来对待:0、0.0、"" 和 None(Python 里表示"这里没有值")都表现得像 False。其他一切都表现得像 True。这在控制流一章里会用得上。
True 和 False,它们藏在你写的每一个 if 背后。有趣的一点:0、""、[] 和 None 都算 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 |
type() 告诉你某个东西是什么,isinstance() 检查它是不是给定的类型。而且 Python 不会把字符串和数字硬粘在一起,所以要先用 str() 或 int() 转换。这个坑每个人都踩过一次。 实战演练
一个把四种类型放在一起工作的小脚本。输出这几行用了f-string来把值嵌入文本:在开头的引号前加个 f,把变量包在 {} 里,Python 就会把它替换成变量的实际值。你会在下一章里正式学到它们。
player_name = "Alice"
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 不会悄悄地帮你把它们混在一起。

