变量与类型
每个程序都需要记住一些东西。一个测验需要记住玩家的名字。一个游戏需要记住当前分数。一个天气脚本需要记住你查询的城市。Python 用变量来做这件事:你给值起个名字,这样就可以在整个程序中使用它。
player_name = "李明"
score = 0
city = "北京"三行代码,三样东西 Python 现在会记住。对每一行,Python 先处理右边的值,然后把它存在左边的名字下面。之后用那个名字,Python 就会把值还给你。
存储一个值
= 符号差不多能绊倒每个从数学课来的人。在 Python 中,= 不是"等于"。它的意思是**把这个值存在这个名字下面**:
city = "北京"city 获得 "北京"。你在告诉 Python:记住 "北京" 并给它贴上 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 = "李明"
total_price = 49.99
is_logged_in = True
MAX_RETRIES = 3
# 一小时内你就会后悔这些
x = "李明"
tp = 49.99
b = True一个早期值得知道的陷阱:不要用 Python 内建的名字给变量命名,比如 list、input、type 或 print。Python 允许,但你会偷偷破坏那个内建的对象在之后的整个作用域,产生的错误难以追踪。
snake_case 你就没问题。我一个新手错误:别叫变量 list 或 print。Python 让你这么干,然后之后一切都变奇怪了,零警告。 你能存什么
Python 有四种类型你在几乎每个程序里都用得上。Python 从你怎么写值来推断是哪种类型。你从不显式声明一个类型。
文本(str)
任何文本都放在引号里,单引号或双引号。引号告诉 Python 你是指字面字符,不是变量名。一旦创建,字符串不能就地改变。字符串章节覆盖了你能用字符串做的所有事。
player_name = "李明"
city = "北京"
message = '游戏结束'如果你的文本包含一个撇号,用双引号来避免得转义它:
note = "这是美好的一天"
note = '这是美好的一天' # 同样的结果整数(int)
整数写出来不需要引号或小数点。Python 叫它们整数。它们能有多大你需要;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("你的分数是 " + score) # TypeError
print("你的分数是 " + 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 字符串在文本里嵌入值:在开头引号前放 f 并包装任何变量在 {}。Python 把它替换为变量的实际值。你会在下一章适当地学它们。
player_name = "李明"
level = 3
accuracy = 0.94
is_premium = True
print(f"{player_name} 在第 {level} 关,准度 {accuracy:.0%}。")
print(f"高级账户:{is_premium}")类型重要因为 level + 1 工作而 player_name + 1 不工作。每个变量持有一种精确的东西;Python 不会为你偷偷混合它们。

