Kodewick
第 6 课,共 31 课目录

用户输入

第 6 课,共 31 课 · 第 1 部分 · 基础 · 约 15 分钟

到现在为止,程序每次跑都做一样的事。有了 input(),程序可以提一个问题,等用户回答,再用这个回答。点运行,输入你自己的名字;页面上显示的是有人输入 小明 时的样子。

main.py
1name = input("你叫什么名字?")2print(f"你好,{name}!今晚 Wick 会帮你点灯。")
输出
你叫什么名字?小明
你好,小明!今晚 Wick 会帮你点灯。

提一个问题

input() 先显示提示,然后等用户按回车,返回用户输入的内容。把回答存进一个变量,后面才用得上。

部分作用
input("哪个镇?")显示 哪个镇?,等用户回答
town = input(...)把回答存进 town
提示可以不写。英文提示最后留个空格,不然回答会紧贴在提示后面

一个 input() 问一个问题。写两个,就按顺序问两个。

main.py
1town = input("镇名:")2street = input("街道:")3print(f"送到{town}{street}街")
输出
镇名:灯火镇
街道:北
送到灯火镇北街

输入永远是字符串

不管用户输入什么,input() 返回的都是字符串,哪怕看起来是个数字。"7" 是文字,和 "七" 一样。

先猜一猜

第二行会显示什么?

1lamps = "7"  # 用户输入 7 时,input() 返回的就是它2print(lamps + lamps)

用 type() 一看就清楚。拿它加一个数字,Python 就停下来了:

main.py
1lamps = input("有几盏灯?")2print(type(lamps))3print(lamps + 1)
输出
有几盏灯?7
<class 'str'>
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(lamps + 1)
TypeError: can only concatenate str (not "int") to str

发生了什么: 字和数不能直接用 + 接在一起。先用 str() 把数变成字。

TypeError 的意思是:Python 不会把字符串和数字相加。它不会去猜你想干什么。

把文字变成数字

第 2 课见过 int() 和 float()。把 input() 套在里面,就得到一个能计算的数字。整数用 int(),可能带小数点的用 float()。

main.py
1lamps = int(input("有几盏灯?"))2hours = float(input("每盏灯亮几小时:"))3print(f"今晚一共亮灯小时数:{lamps * hours}")
输出
有几盏灯?7
每盏灯亮几小时:2.5
今晚一共亮灯小时数:17.5

小技巧: int(input("...")) 从里往外读:先提问,再把回答转换成整数。

回答不是数字怎么办

用户什么都可能输入。int() 只接受看起来像整数的文字,输入一个词或者一个小数,就会报 ValueError:

main.py
1lamps = int(input("有几盏灯?"))2print(f"灯:{lamps}")
输出
有几盏灯?七
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    lamps = int(input("有几盏灯?"))
ValueError: invalid literal for int() with base 10: '七'

发生了什么: 这串字不是一个整数,int() 没法把它变成数。

转换之前,可以先用字符串方法 .isdigit() 看一看:每个字符都是数字时它给 True,否则给 False。

main.py
1print("42".isdigit())2print("seven".isdigit())3print("3.5".isdigit())4print("-4".isdigit())
输出
True
False
False
False

注意后两行:小数点和负号都不算数字。现在你能发现问题了;第 8 课的 if 能让程序据此做不同的事,第 21 课的 try 和 except 能直接接住这个错误。

清理输入

人们会不小心多打空格,大小写也随手乱写。第 5 课的字符串方法可以先把回答整理干净。直接接在 input() 后面连着调用:

main.py
1answer = input("要点灯吗?(yes/no)").strip().lower()2print(f"[{answer}]")3print(answer == "yes")
输出
要点灯吗?(yes/no)  YeS
[yes]
True

方括号能看出空格已经去掉了。先清理,"YES"、" yes"、"Yes " 就都变成同一个 "yes"。(最后的 == 是比较两个值,第 7 课专门讲。)

一次读几个值

有时候一个回答里有好几个值,比如 3 4。.split() 按空格把它切开,可以一次用两个变量接住。切出来的还是字符串,所以每个都要转换。

main.py
1size = input("宽和高:")2w, h = size.split()3print(f"面积:{int(w) * int(h)}")
输出
宽和高:3 4
面积:12

a, b = ... 左边有几个名字,右边就要正好有几块。输入三个数字,Python 会报 ValueError。.split() 返回的其实是一个列表;列表在第 9 课专门讲。

一个小计算器

把学到的放在一起:问两个数,转换,再用 f-string 显示几个结果。

main.py
1a = float(input("第一个数:"))2b = float(input("第二个数:"))3print(f"{a} + {b} = {a + b}")4print(f"{a} - {b} = {a - b}")5print(f"{a} * {b} = {a * b}")6print(f"{a} / {b} = {round(a / b, 2)}")
输出
第一个数:17
第二个数:5
17.0 + 5.0 = 22.0
17.0 - 5.0 = 12.0
17.0 * 5.0 = 85.0
17.0 / 5.0 = 3.4

用你自己的数再运行一次。第二个数输入 0 试试,看看是哪一行出错。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。练习检查的时候没有人在打字,所以「用户的回答」已经放在变量里了,就当它是从 input() 来的。

练习 1

翻一倍

text 里是用户输入的内容。显示这个数的两倍:84。

要显示
84
exercise1.py
1text = "42"  # 就当这是从 input() 来的2print(text * 2)
输出
点「运行」或按 Ctrl+Enter
练习 2

整理回答

把 reply 整理干净,让程序显示 yes:没有空格,没有大写。

要显示
yes
exercise2.py
1reply = "   YES "  # 就当这是从 input() 来的2print(reply)
输出
点「运行」或按 Ctrl+Enter
练习 3

算总价

line 里是单价和数量,中间一个空格。显示 总价:7.5。

要显示
总价:7.5
exercise3.py
1line = "2.5 3"  # 就当这是从 input() 来的2# 在这里写
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • input("提示") 显示提示,等用户输入,返回输入的内容。
  • 回答永远是字符串。要计算,先用 int() 或 float() 转换。
  • 不是整数的文字交给 int() 会报 ValueError;.isdigit() 能先检查是不是只有数字(负号、小数点都不算)。
  • 用 .strip() 和 .lower() 清理回答,不同的写法就能对上。
  • a, b = text.split() 从一个回答里读出几个值。