用户输入
到现在为止,程序每次跑都做一样的事。有了 input(),程序可以提一个问题,等用户回答,再用这个回答。点运行,输入你自己的名字;页面上显示的是有人输入 小明 时的样子。
1name = input("你叫什么名字?")2print(f"你好,{name}!今晚 Wick 会帮你点灯。")
你叫什么名字?小明 你好,小明!今晚 Wick 会帮你点灯。
提一个问题
input() 先显示提示,然后等用户按回车,返回用户输入的内容。把回答存进一个变量,后面才用得上。
| 部分 | 作用 |
|---|---|
input("哪个镇?") | 显示 哪个镇?,等用户回答 |
town = input(...) | 把回答存进 town |
| 提示 | 可以不写。英文提示最后留个空格,不然回答会紧贴在提示后面 |
一个 input() 问一个问题。写两个,就按顺序问两个。
1town = input("镇名:")2street = input("街道:")3print(f"送到{town}{street}街")
镇名:灯火镇 街道:北 送到灯火镇北街
输入永远是字符串
不管用户输入什么,input() 返回的都是字符串,哪怕看起来是个数字。"7" 是文字,和 "七" 一样。
第二行会显示什么?
1lamps = "7" # 用户输入 7 时,input() 返回的就是它2print(lamps + lamps)
lamps 里是字符串 "7",两个字符串用 + 是拼起来。所以得到 77,不是 14。
用 type() 一看就清楚。拿它加一个数字,Python 就停下来了:
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()。
1lamps = int(input("有几盏灯?"))2hours = float(input("每盏灯亮几小时:"))3print(f"今晚一共亮灯小时数:{lamps * hours}")
有几盏灯?7 每盏灯亮几小时:2.5 今晚一共亮灯小时数:17.5
小技巧: int(input("...")) 从里往外读:先提问,再把回答转换成整数。
回答不是数字怎么办
用户什么都可能输入。int() 只接受看起来像整数的文字,输入一个词或者一个小数,就会报 ValueError:
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。
1print("42".isdigit())2print("seven".isdigit())3print("3.5".isdigit())4print("-4".isdigit())
True False False False
注意后两行:小数点和负号都不算数字。现在你能发现问题了;第 8 课的 if 能让程序据此做不同的事,第 21 课的 try 和 except 能直接接住这个错误。
清理输入
人们会不小心多打空格,大小写也随手乱写。第 5 课的字符串方法可以先把回答整理干净。直接接在 input() 后面连着调用:
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() 按空格把它切开,可以一次用两个变量接住。切出来的还是字符串,所以每个都要转换。
1size = input("宽和高:")2w, h = size.split()3print(f"面积:{int(w) * int(h)}")
宽和高:3 4 面积:12
a, b = ... 左边有几个名字,右边就要正好有几块。输入三个数字,Python 会报 ValueError。.split() 返回的其实是一个列表;列表在第 9 课专门讲。
一个小计算器
把学到的放在一起:问两个数,转换,再用 f-string 显示几个结果。
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() 来的。
翻一倍
✓text 里是用户输入的内容。显示这个数的两倍:84。
84
1text = "42" # 就当这是从 input() 来的2print(text * 2)
整理回答
✓把 reply 整理干净,让程序显示 yes:没有空格,没有大写。
yes
1reply = " YES " # 就当这是从 input() 来的2print(reply)
算总价
✓line 里是单价和数量,中间一个空格。显示 总价:7.5。
总价:7.5
1line = "2.5 3" # 就当这是从 input() 来的2# 在这里写
这一课学会了
input("提示")显示提示,等用户输入,返回输入的内容。- 回答永远是字符串。要计算,先用
int()或float()转换。 - 不是整数的文字交给
int()会报ValueError;.isdigit()能先检查是不是只有数字(负号、小数点都不算)。 - 用
.strip()和.lower()清理回答,不同的写法就能对上。 a, b = text.split()从一个回答里读出几个值。