外观
第5周:第二次上机课
本次围绕 input 输入和 print 输出讲解:先按输入格式读数据,再按题目要求输出。round() 放在 f-string 中一起比较。
一、input():基本输入方式与组合
PPT:第1章第27页;第2章第32、35、46–47、50页。
1. 一行输入:一次 input() 读一整行
例子:原样输出输入的一行文字。
输入
text
hello world代码
python
s = input() # 输入 hello world,得到字符串 "hello world"
print(s)输出
text
hello worldinput() 返回字符串,去掉行尾换行符;行内空格会保留。读数字时按需要转换:n = int(input()) 或 x = float(input())。OJ 中不加“请输入”等提示文字。
2. 多行输入:每行分别调用 input()
两整数求和:把两行中的整数相加。
输入
text
3
6python
a = int(input())
b = int(input())
print(a + b)输出
text
9两次 input() 按顺序读取两行。没有转换时,"3" + "6" 是字符串拼接,得到 "36"。不要少读或多读一行。
3. 一行用空格分开:先 split,再转换
求三个数的和:三个数在同一行,用空格分开。
输入
text
1 2.3 4.7python
a, b, c = input().split() # 得到 "1"、"2.3"、"4.7"
a = float(a)
b = float(b)
c = float(c)
print(a + b + c)输出
text
8.0split() 按空白拆分,连续多个空格也可以;拆出的每一项仍是字符串,需要分别转换。float(input().split()) 把整个列表交给 float(),会报错。一次 input().split() 只处理当前这一行。
多个整数一起转换:两种可以先用的写法
map 和列表推导式现在还没学到,可以先照着下面的写法使用,暂时不用完全理解原理。它们都能把空格分开的每个字段分别转成整数,省去逐个写 int()。
例子:一行输入三个整数,输出它们的和。
输入
text
3 6 9方法一:map(int, input().split())
python
a, b, c = map(int, input().split())
print(a + b + c)方法二:[int(x) for x in input().split()]
python
a, b, c = [int(x) for x in input().split()]
print(a + b + c)两种方法的输出都是
text
18两种写法左边都是三个变量,所以这一行必须正好有三个数。若想把一行中的多个整数整体存起来,可以写:
python
numbers = [int(x) for x in input().split()]
print(numbers) # 输入 3 6 9,输出 [3, 6, 9]输入含小数时,把转换函数 int 换成 float。例如前面的 1 2.3 4.7 应写 a, b, c = map(float, input().split()),或 a, b, c = [float(x) for x in input().split()]。
原理说明(现在还没学到,可以先用,暂时不用完全理解)
先把两种写法共有的部分拆开看:
python
line = input() # "3 6 9"
parts = line.split() # ["3", "6", "9"],每一项仍是字符串map:让同一个函数处理每一项。 map(int, parts) 依次对 "3"、"6"、"9" 调用 int,提供整数 3、6、9。左边的 a, b, c 再分别接住三个整数。
python
a, b, c = map(int, parts)这里传给 map 的是函数名 int,表示“请用这个函数转换每一项”,不是先调用 int()。map 的结果本身不是列表;要存成列表,可以写 numbers = list(map(int, parts))。
列表推导式:逐项转换,再组成一个新列表。 [int(x) for x in parts] 可以读成:“对 parts 中的每一项 x,算出 int(x),把结果放进新列表。”这里的 x 是依次取出的字段,不是需要提前定义的变量。
python
numbers = [int(x) for x in parts] # [3, 6, 9]
a, b, c = numbers两种方法都按原输入顺序逐项转换。它们不会多读一行,也不能把不符合数字格式的文字转成整数。
4. 多行与空格分隔结合:按每一行的格式读取
基础输入输出练习-04:第一行是一个浮点数,第二行是两个空格分隔的整数,求三个数的平均值并显示两位小数。
输入
text
1.0
2 3代码
python
a = float(input()) # 第一次:读第一行 "1.0"
b, c = input().split() # 第二次:读第二行,拆成 "2"、"3"
b = int(b)
c = int(c)
average = (a + b + c) / 3
print(f"{average:.2f}") # 输出格式在下一部分讲输出
text
2.00这里有两行输入,所以调用两次 input();第二行包含两个数,所以只对第二次的结果使用 split()。不能把 2 3 整行交给 int(),也不能用三次 input() 分别读取三个数。
二、print():两个参数与 f-string
PPT:第1章第28页;第2章第19、36–40页。
1. sep:输出项之间放什么
默认 sep=" ",多个输出项之间放一个空格。
秒转时分秒:用冒号连接时、分、秒。
输入
text
100python
sec = int(input())
h = sec // 3600
m = sec % 3600 // 60
s = sec % 60
print(h, m, s, sep=":")输出
text
0:1:40| 写法 | 输出 |
|---|---|
print(h, m, s) | 0 1 40 |
print(h, m, s, sep=":") | 0:1:40 |
print(h, ":", m, ":", s) | 0 : 1 : 40,多出空格 |
2. end:本次输出之后放什么
默认 end="\n",每次 print() 后换行。用相同的 A、B 对比:
| 正常直接 print | 使用 end="" | 使用 end=" " |
|---|---|---|
print("A")print("B") | print("A", end="")print("B") | print("A", end=" ")print("B") |
| 输出两行:先 A,再 B | 输出一行:AB | 输出一行:A B |
正常直接输出:
python
print("A")
print("B")text
A
B不换行输出:
python
print("A", end="")
print("B")text
AB两个参数一起使用: 同一行里用冒号分隔,本次输出后不换行。
python
print(0, 1, 40) # 正常:默认空格分隔、末尾换行
print(0, 1, 40, sep=":", end=" → ")
print("结束")text
0 1 40
0:1:40 → 结束这些对比例子不需要输入。记住:sep 管中间,end 管末尾,两个参数都用参数名指定。
3. f-string:把变量、表达式和格式写进字符串
引号前加 f,花括号里放变量或表达式。例如 f"{h}:{m}:{s}" 可以生成 0:1:40。
简单的 A*B 问题要求固定两位小数。
输入
text
1
3.4python
a = float(input())
b = float(input())
print(f"{a * b:.2f}")输出
text
3.40.2f 表示小数点后显示两位;注意引号前的 f、表达式外的 {} 和格式中的小数点。
round 和 .2f 都会舍入,但输出效果不总一样。 先看同一个数:
python
x = 3.456
print(round(x, 2))
print(f"{x:.2f}")两行都输出 3.46,所以仅看这个例子,容易觉得两种写法一样。换成 3.4:
python
x = 3.4
print(round(x, 2))
print(f"{x:.2f}")输出
text
3.4
3.40round(x, 2)是把数值舍入到小数点后两位。3.4已经不需要舍入,得到的数字还是3.4;正常打印数字时不会特意补一个零。f"{x:.2f}"是把数值写成小数点后恰好两位的字符串。小数位多了会舍入,少了会补零,所以这里显示3.40。
| x | print(round(x, 2)) | print(f"{x:.2f}") |
|---|---|---|
3.456 | 3.46 | 3.46 |
3.4 | 3.4 | 3.40 |
6.0 | 6.0 | 6.00 |
为什么还要区分“数字”和“字符串”? 看后面拿结果做什么:
python
x = 3.456
y = round(x, 2) # y 是数字 3.46
text = f"{x:.2f}" # text 是字符串 "3.46"
print(y + 1) # 数字相加,输出 4.46
print(text + "元") # 字符串拼接,输出 3.46元text + 1 会报错,因为字符串不能直接与整数相加。这两种写法都不会自动改掉 x;要保存舍入后的数字,需要写 y = round(x, 2),或用 x = round(x, 2) 更新原变量。
做题时怎么选? 要求输出固定两位小数(例如 3.40),用 print(f"{x:.2f}");需要得到舍入后的数字继续计算,才把 round(x, 2) 的结果保存到变量里。f-string 不必先配合 round() 才能显示两位小数。
三角形题提示周长用 f-string、面积用 round()。三边为 3、4、5 时,计算后周长是 12.0、面积是 6.0:
python
perimeter = 12.0
area = 6.0
print(f"{perimeter:.2f}")
print(round(area, 2))输出(这里直接使用计算后的数值)
text
12.00
6.0按题目要求选择写法,print(round(x, 2)) 不保证显示两位小数。先完成计算,最后处理输出;舍入边界的详细解释见完整版。