变量和类型

每个程序都需要记住一些东西。一个测验需要记住玩家的名字。一个游戏需要记住当前的分数。一个天气脚本需要记住你要查询的城市。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 = "It's a great day"
note = 'It\'s a great day' # 相同的结果,使用转义整数 (int)
整数在不加引号或小数点的情况下输入。Python 将它们称为整数。它们可以像你需要的那样大;Python 可以毫不费力地处理任意大的数字。
score = 0
age = 28
population = 8_100_000_000 # 下划线仅用于可读性8_100_000_000 中的那些下划线仅用于让你能读它。 小数 (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(float("3.14")) | 3(先转换为浮点数,再转为整数) |
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} is on level {level} with {accuracy:.0%} accuracy.")
print(f"Premium account: {is_premium}")类型重要,因为 level + 1 有效而 player_name + 1 不有效。每个变量持有恰好一种东西;Python 不会为你无声地混合它们。

