值、类型与输入输出
引入| English | 释义 | 拼音 |
|---|---|---|
| type/taɪp/ | 类型 | lèi xíng |
| value/ˈvæljuː/ | 值 | zhí |
| string/strɪŋ/ | 字符串 | zì fú chuàn |
| variable/ˈveərɪəbl/ | 变量 | biàn liàng |
| f-string/ef strɪŋ/ | 格式化字符串 | gé shì huà zì fú chuàn |
为什么收银机显示 66 杯咖啡?
- 咖啡店的收银机问“Coffees?”,收银员输入
6。程序为“买一送一”把它乘以 2,却打印出66,而不是12。 - 程序并没有坏。它收到的是文本 "6",把文本乘以 2 就是把它重复一次。这节课讲的就是:弄清每个值是哪一种东西。
coffees = input("Coffees? ") # the user types 6
print(coffees * 2) # prints 66
每个值都有类型
- 值(value)是一份数据。它的类型(type)说明它是哪一种:
int(整数)、float(小数)、str(文本,即字符串(string))或bool(True或False)。 type()告诉你类型:type(42)是int,type(4.0)是float,type("42")是str。引号让"42"成为文本。
把每个值与它的类型配对。
难度 2/5 · 今日首次完成可获 140 金币及少量额外奖励
小数点使它成为 float,引号使它成为字符串,True/False 是 bool 的两个值。
类型决定运算符做什么
+对数字是相加,对字符串是连接:3 + 4是7,但"3" + "4"是"34"。把两者混在一起,"3" + 4会引发TypeError:Python 不会替你猜。- 除法有三种形式:
7 / 2是3.5(结果总是float),7 // 2是3(整数部分),7 % 2是1(余数)。
print(3 + 4, "3" + "4", 7 / 2, 7 // 2, 7 % 2)
# 7 34 3.5 3 1
print("3" + "4") 显示什么?
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
两个值都是字符串,所以 + 把它们连接起来。只有数字相加才得 7。
17 % 5 的值是多少?
难度 2/5 · 今日首次完成可获 140 金币及少量额外奖励
% 给出余数:$17 = 3 \times 5 + 2$,所以 17 % 5 是 2,17 // 5 是 3。
变量是贴在值上的名字标签
- **变量(variable)**是用
=绑定到某个值的名字。price = 3.50让名字price指向值3.50。 - 再次赋值会把标签移到新的值上。执行
a = 5、b = a、a = 7之后,名字b仍然指向5。

名字指向值
逐步运行程序。b = a 让 b 指向同一个值 5;之后把 a 改为 7,b 仍是 5。
执行 a = 5、b = a、a = 7 之后,print(b) 显示什么?
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
b = a 让 b 指向值 5。之后把名字 a 移到 7,并不会移动 b。
input 总是给出字符串
input()把用户输入的内容作为str返回,即使它看起来像数字。要有意识地转换:int(text)或float(text)。- 无法完成的转换会引发
ValueError:int("4.5")会失败,因为4.5不是整数。小数要用float("4.5")。
coffees = int(input("Coffees? ")) # 6 -> the int 6
print(coffees * 3.50) # 21.0
用户在 n = int(input("Amount? ")) 处输入 4.5。会发生什么?
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
int() 只接受表示整数的文本。4.5 要用 float();如果确实想去掉小数部分,用 int(float(text))。
浮点数只是接近,并不精确
- 计算机用二进制存储
float,所以许多小数会有极小的舍入。0.1 + 0.2打印出0.30000000000000004,而0.1 + 0.2 == 0.3是False。 - 比较浮点数要用容差:
abs(x - y) < 1e-9,或math.isclose(x, y)。涉及金钱时,许多程序用int记录整数便士。
在 Python 中,0.1 + 0.2 == 0.3 为 True。
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
0.1 + 0.2 存储为 0.30000000000000004,所以结果是 False。应使用 math.isclose 或一个小的容差来比较。
在输出时才格式化
- **格式化字符串(f-string)**把值放进文本:
f"Total: £{total:.2f}"显示两位小数。 - 格式化只改变打印出来的样子,存储的值不变。所以计算时一直用数字,只在显示时格式化一次。
- 收银机每杯咖啡收 £3.50。读入杯数并打印总价。
coffees = int(input("Coffees? "))把输入的"6"变成int值6。total = coffees * 3.50得到float值21.0(int乘以float得到float)。print(f"Total: £{total:.2f}")打印Total: £21.00。运行每一行之前,先预测它的类型。
print(f"{2/3:.2f}") 显示什么?
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
.2f 把显示的值四舍五入到两位小数。2/3 这个值本身不变。
容易丢分的地方
- 忘记转换
input。input()总是返回字符串;"6" * 2是"66"。 - 用
+混合str和int。"Sold " + 5会引发TypeError。写成"Sold " + str(5),或print("Sold", 5)。 - 用
==比较浮点数。 要使用容差。 =与==。=绑定名字;==判断两个值是否相等。
把咖啡店收银程序的各行按顺序排列。
难度 3/5 · 今日首次完成可获 200 金币及少量额外奖励
读取、转换、计算,然后格式化输出。每一行都需要上一行产生的值。
你掌握了
- 每个值都有类型:
int、float、str、bool;类型决定运算符的作用。 - 变量是名字标签,
=移动标签。input()总是返回str,要用int()或float()转换。 /得到float,//得到整数部分,%得到余数;比较浮点数要用容差;输出时用 f-string 格式化。