Skip to content

第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 world

input() 返回字符串,去掉行尾换行符;行内空格会保留。读数字时按需要转换:n = int(input()) 或 x = float(input())。OJ 中不加“请输入”等提示文字。

2. 多行输入:每行分别调用 input() ​

两整数求和:把两行中的整数相加。

输入

text
3
6
python
a = int(input())
b = int(input())
print(a + b)

输出

text
9

两次 input() 按顺序读取两行。没有转换时,"3" + "6" 是字符串拼接,得到 "36"。不要少读或多读一行。

3. 一行用空格分开:先 split,再转换 ​

求三个数的和:三个数在同一行,用空格分开。

输入

text
1 2.3 4.7
python
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.0

split() 按空白拆分,连续多个空格也可以;拆出的每一项仍是字符串,需要分别转换。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
100
python
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.4
python
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.40
  • round(x, 2) 是把数值舍入到小数点后两位。3.4 已经不需要舍入,得到的数字还是 3.4;正常打印数字时不会特意补一个零。
  • f"{x:.2f}" 是把数值写成小数点后恰好两位的字符串。小数位多了会舍入,少了会补零,所以这里显示 3.40。
xprint(round(x, 2))print(f"{x:.2f}")
3.4563.463.46
3.43.43.40
6.06.06.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)) 不保证显示两位小数。先完成计算,最后处理输出;舍入边界的详细解释见完整版。

课程资料由授课教师、助教与同学共同积累。