Python: 变量与基本数据类型
上一课我们让 Python 输出了一行"Hello, World!"。但如果每次都只能输出固定的内容,编程就太无聊了。这一课我们来学变量——它是编程中最基础也最重要的概念,相当于给数据贴上一张带名字的标签,让你可以随时存取和修改。
1. 变量是什么
变量就是给数据起个名字。你可以把它想象成一个带标签的盒子:标签上写着名字(变量名),盒子里装着数据(值)。
# 定义一个变量,名字叫 age,里面装了数字 18
age = 18
当你写 age = 18 时,Python 做了两件事:
- 在内存中划出一块空间,存入数字
18。 - 给这个空间贴上标签
age,以后你叫age,Python 就知道要找那个数字 18。
从此,age 就代表数字 18,你可以用它来计算、输出、修改:
age = 18
print(age) # 输出 18
print(age + 5) # 输出 23
age = 20 # 换个值,盒子里的内容变了
print(age) # 输出 20
age = 18,后面改成 age = 20,同一个名字可以指向不同的值。这在编程中非常关键。
2. 变量的命名规则
Python 对变量名有一些硬性规定和约定俗称的规范:
(1) 必须遵守(否则报错)
| 规则 | 正确的例子 | 错误的例子 |
|---|---|---|
| 只能包含字母、数字、下划线 | my_name、age2 |
my-name(短横线不可以) |
| 不能以数字开头 | name1 |
1name |
| 不能是 Python 的关键字 | my_if |
if(if 是关键字) |
| 区分大小写 | name 和 Name 是两个不同的变量 |
— |
Python 的关键字(也叫保留字)有 35 个,比如 if、for、while、import、class、def、return 等。这些词是 Python 语法的一部分,不能用来做变量名。
(2) 建议遵守(规范写法,PEP 8)
PEP 8 是 Python 的官方代码风格指南,业界普遍遵守:
- 变量名用小写字母,多个单词用下划线连接(这叫 snake_case):
student_name、total_score,而不是studentName(camelCase)。 - 常量用全大写:
PI = 3.14159、MAX_SIZE = 100(Python 没有真正的常量,全大写只是一种约定,表示"请别修改我")。 - 名字要有意义:
age比a好,total_students比ts好。代码是用来读的,好名字省一半注释。
# 好名字(一眼就懂)
total_price = 99.9
student_count = 35
# 差名字(看了也不知道在干嘛)
a = 99.9
b = 35
3. 基本数据类型
Python 中常用的基本数据类型有 5 种:
| 类型名称 | Python 写法 | 示例 | 说明 |
|---|---|---|---|
| 整数 | int |
42、-1、1000 |
没有小数点的整数 |
| 浮点数 | float |
3.14、-0.5、2.0 |
带小数点的数 |
| 字符串 | str |
"你好"、'Python' |
文本,用引号包着 |
| 布尔值 | bool |
True、False |
表示真/假,首字母大写 |
| 空值 | NoneType |
None |
表示"什么都没有",首字母大写 |
# 每个类型定义一个变量
age = 25 # int,整数
price = 19.99 # float,浮点数
name = "Charlie" # str,字符串
is_student = True # bool,布尔值
result = None # NoneType,空值
print(age) # 输出 25
print(price) # 输出 19.99
print(name) # 输出 Charlie
print(is_student) # 输出 True
print(result) # 输出 None
(1) 用 type() 查看类型
如果你不确定一个变量是什么类型,可以用 type() 函数检查:
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("Hello")) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type(None)) # <class 'NoneType'>
(2) 动态类型
Python 是动态类型语言,意思是同一个变量可以先后存放不同类型的值:
x = 10 # 此时 x 是整数
print(x) # 输出 10
x = "你好" # 同一变量,变成字符串
print(x) # 输出 你好
x = True # 又变成布尔值
print(x) # 输出 True
这在 C++ 或 Java 这样的静态类型语言中是不允许的——声明时是什么类型,一辈子就是什么类型。动态类型的优点是灵活、代码简洁,缺点是一个变量不小心被改了类型,可能导致运行时错误(后面会看到例子)。
4. print() 的更多用法
第01课我们已经见了 print(),这里补充两个常用技巧:
(1) 用逗号输出多个值
name = "Diana"
age = 22
print("我叫", name, ",今年", age, "岁")
# 输出:我叫 Diana ,今年 22 岁
print() 的多个参数之间会自动加一个空格。如果想去掉这个空格,或者用其他符号分隔,可以用 sep 参数:
print("2026", "06", "19", sep="-")
# 输出:2026-06-19
(2) 用 end 控制结尾
默认情况下,print() 会在输出内容后面加一个换行。用 end 参数可以改变这个行为:
print("第一行", end=" → ")
print("第二行", end=" → ")
print("第三行")
# 输出:第一行 → 第二行 → 第三行
5. f-string:在字符串中插入变量
你已经在前面的例子中见过 f"你好,{name}" 这种写法了。它叫 f-string(格式化字符串),是 Python 中最常用的字符串格式化方式。简单说就是:在字符串前面加一个 f,然后在里面用 {} 把变量名包起来,Python 就会把变量的值替换进去。
name = "Diana"
age = 22
print(f"我叫{name},今年{age}岁。")
# 输出:我叫Diana,今年22岁。
花括号里不只是放变量名,还可以放表达式:
a = 10
b = 3
print(f"{a} + {b} = {a + b}") # 输出:10 + 3 = 13
print(f"{a} × {b} = {a * b}") # 输出:10 × 3 = 30
还可以控制数字的显示格式:
pi = 3.14159265
print(f"π = {pi}") # 输出:π = 3.14159265
print(f"π ≈ {pi:.2f}") # 输出:π ≈ 3.14(保留2位小数)
print(f"π ≈ {pi:.4f}") # 输出:π ≈ 3.1416(保留4位小数)
# 大数字加千分位分隔符
big = 1234567
print(f"{big:,}") # 输出:1,234,567
:.2f 中的冒号后面是格式说明——. 表示小数,2 是小数位数,f 表示浮点数。:, 表示加千分位逗号。记不住不要紧,知道有这回事就行,用多了自然就熟了。
6. 示例
▶ 示例 1:用变量记录个人信息(难度⭐)
这个例子展示了如何用变量存储个人信息,并在输出中引用它们。
# 用变量记录个人信息
name = "Alice" # 字符串——用引号包起来的文本
age = 28 # 整数——不带小数点的数字
height = 1.75 # 浮点数——带小数点的数字
is_programmer = True # 布尔值——要么 True,要么 False
# 用 f-string 把变量的值嵌入到输出的文本中
# f 前缀告诉 Python:花括号 {} 里面是变量名,把它替换成具体的值
print(f"姓名:{name}")
print(f"年龄:{age} 岁")
print(f"身高:{height} 米")
print(f"是否在学编程:{is_programmer}")
# 估算一下年龄和身高的关系(纯娱乐)
print(f"{name} 的身高是年龄的 {height / age:.3f} 倍")
运行结果:
姓名:Alice
年龄:28 岁
身高:1.75 米
是否在学编程:True
Alice 的身高是年龄的 0.062 倍
这里有一个小细节:{height / age:.3f} 中的 :.3f 表示"保留 3 位小数",控制数字的显示格式。
▶ 示例 2:变量之间的运算(难度⭐⭐)
不同类型的变量,可以做不同的运算。但有些运算规则需要留意。
# 数值运算
a = 10
b = 3
print(f"{a} + {b} = {a + b}") # 加法:13
print(f"{a} - {b} = {a - b}") # 减法:7
print(f"{a} * {b} = {a * b}") # 乘法:30
print(f"{a} / {b} = {a / b}") # 除法:3.333...(结果是浮点数)
print(f"{a} // {b} = {a // b}") # 整除:3(只保留整数部分)
print(f"{a} % {b} = {a % b}") # 取余:1(10 ÷ 3 = 3 余 1)
print(f"{a} ** {b} = {a ** b}") # 幂运算:10³ = 1000
# 字符串拼接
first_name = "张"
last_name = "三"
full_name = first_name + last_name # + 在字符串中的作用是拼接
print(f"全名:{full_name}")
# 类型不同不能混用
# 下面的代码会报错,因为不能把字符串和数字加起来
# result = "年龄:" + 25 ← 取消注释试试看
运行结果:
10 + 3 = 13
10 - 3 = 7
10 * 3 = 30
10 / 3 = 3.3333333333333335
10 // 3 = 3
10 % 3 = 1
10 ** 3 = 1000
全名:Alice
+ 在数字之间是加法,在字符串之间是拼接。但字符串和数字之间不能用 +——Python 不会自动帮你把数字转成字符串。如果非要拼接,可以手动转换:"年龄:" + str(25),str() 函数可以把其他类型转成字符串。
▶ 示例 3:多重赋值与交换变量(难度⭐⭐⭐)
Python 有一些简洁的写法,让代码更优雅:
# 一行给多个变量赋值
x, y, z = 10, 20, 30
print(f"x={x}, y={y}, z={z}") # x=10, y=20, z=30
# 交换两个变量的值——在其他语言里需要额外一个临时变量
# 但在 Python 中一行搞定
a, b = 5, 10
print(f"交换前:a={a}, b={b}")
a, b = b, a # 神奇的一行
print(f"交换后:a={a}, b={b}")
# 给多个变量赋同一个值
p = q = r = 0
print(f"p={p}, q={q}, r={r}") # p=0, q=0, r=0
运行结果:
x=10, y=20, z=30
交换前:a=5, b=10
交换后:a=10, b=5
p=0, q=0, r=0
a, b = b, a 之所以能交换,是因为 Python 在执行赋值之前,会先计算等号右边的所有表达式,把结果存起来,然后一次性赋给左边的变量。整个过程是安全的。
7. 常见应用场景
- 游戏中记录玩家状态:玩家的生命值、分数、等级都用变量存储,随着游戏进程不断更新。
- 电商网站计算价格:商品单价、数量、折扣、运费——这些都是变量。程序用它们计算出最终价格。
- 配置管理:数据库地址、API 密钥、网站名称等配置信息存在变量中,改一个地方就能影响整个程序的行为。
❓ 常见问题
float 类型为什么不精确?0.1 + 0.2 为什么等于 0.30000000000000004?1/3 = 0.333... 一样,二进制也无法精确表示 0.1 和 0.2。如果你需要精确计算(比如处理金额),用 decimal 模块(后面会讲到),不要用 float。None 和 0、空字符串 "" 有什么区别?None 表示"什么都没有"、"值不存在",它和 0、""、False 都不是一回事。0 是一个数字,"" 是一个空字符串,False 是布尔假值——它们都是"有东西的",只是恰好表示"没有内容"。而 None 是"连容器都没有"。想象一下:"" 是一个空碗,None 是连碗都没有。📖 小节
- 变量是给数据起的名字,用
=赋值,值可以随时改变 - 变量名只能包含字母、数字、下划线,不能以数字开头,不能是关键字
- Python 有 5 种基本数据类型:
int(整数)、float(浮点数)、str(字符串)、bool(布尔值)、NoneType(空值) - Python 是动态类型语言,同一个变量可以存放不同类型的值,但建议保持类型一致
type()可以查看变量的数据类型- f-string 用
f"xxx{变量}"的语法在字符串中插入变量和表达式,是 Python 最常用的格式化方式
📝 作业
-
基础题(难度⭐):定义三个变量
city、temperature、is_sunny,分别存储你所在的城市名、今日温度(浮点数)、是否是晴天(布尔值),然后用print()输出一句完整的描述。 -
进阶题(难度⭐⭐):定义两个整数变量
minutes和hours,把hours转换成分钟数,加上minutes,输出总共有多少分钟。比如hours=2, minutes=15应输出135分钟。提示:1 小时 = 60 分钟。 -
挑战题(难度⭐⭐⭐):不使用临时变量,交换三个变量的值,实现循环移位:
a → b → c → a(即 a 的新值是 b 原来的值,b 的新值是 c 原来的值,c 的新值是 a 原来的值)。提示:核心思路是a, b, c = b, c, a。