2.4 输入与输出
到目前为止,我们程序里的数据都是写死在代码里的——想换个名字、换个数字,就得改代码。真正的程序不是这样的:计算器等你按数字,网页等你填表单,游戏等你操作。程序要能跟用户对话:
- 输出:程序对用户说话 →
print() - 输入:用户对程序说话 →
input()
print() 已经用了很多次,先把它的隐藏技能补齐,再学新主角 input()。
print() 的三个进阶用法
1. 一次打印多个内容:用逗号隔开,各部分之间自动用空格分隔,而且不限类型——这也是 f-string 之外另一种偷懒的打印方式:
name = "小明"
age = 18
print("姓名:", name, "年龄:", age) # 姓名: 小明 年龄: 18
print("年龄:", age) # 数字不用转 str,逗号分隔时 print 自己会处理
2. sep 参数:把默认的空格分隔符换成别的(sep = separator,分隔符):
print("2026", "07", "26", sep="-") # 2026-07-26
print("www", "python", "org", sep=".") # www.python.org
3. end 参数:print 打印完默认会换行,end 可以改掉这个行尾行为:
print("加载中", end="...")
print("完成")
# 输出:加载中...完成 ← 两个 print 连在了一行
反过来,想空一行就打印个空的:print()。
💡
sep="-"这种"名字=值"的写法叫关键字参数,第 5 章学函数时会正式讲,现在会用就行。
input():让程序等用户说话
新主角登场。input() 的作用是:程序暂停,等用户在终端输入内容并按下回车,然后把输入的内容作为结果返回。
name = input("请输入你的名字:")
print(f"你好,{name}!")
运行它,感受一下"程序停下来等你":
请输入你的名字:█ ← 光标闪烁,程序在等你打字
输入"小明"按回车:
请输入你的名字:小明
你好,小明!
拆解一下这行代码的执行过程:
name = input("请输入你的名字:")
input()先把括号里的提示语显示出来(告诉用户该干嘛,不写提示语用户会对着空屏幕发呆)- 程序暂停,等用户输入并按回车
- 用户输入的内容成为
input()的结果,赋值给变量name
⚠️ 两个新手环境问题:
- 输入要在终端面板里打字(VS Code 下方运行结果那个区域),先用鼠标点一下那里再输入。
- 如果用的是某些在线运行环境或"输出面板",可能不支持 input,报
EOFError——换成本地终端运行就好。
全教程最重要的坑之一:input() 返回的永远是字符串
上一节末尾预告过的场景来了。无论用户输入什么——哪怕是纯数字——input() 拿到的都是字符串。做个实验:
age = input("请输入你的年龄:")
print(type(age))
输入 18 回车,输出:
<class 'str'>
看清楚了:你以为拿到的是数字 18,实际是字符串 "18"。这时候拿它做数学运算,就会撞上熟悉的 TypeError:
age = input("请输入你的年龄:")
print(age + 1) # ❌ TypeError: can only concatenate str (not "int") to str
更阴险的是不报错的版本——还记得 2.1 的实验吗:
age = input("请输入你的年龄:") # 输入 18
print(age * 3) # 181818 !字符串重复 3 次,不是 54
不报错但结果荒唐,这种 bug 比报错难查得多。所以请刻进脑子里:从 input() 出来的东西,先问自己要不要转类型。
标准解法:int(input()) / float(input())
用 2.1 学过的类型转换函数处理即可。最常见的写法是直接套在外面:
age = int(input("请输入你的年龄:"))
print(f"明年你就 {age + 1} 岁了")
int(input(...)) 这种嵌套调用的执行顺序是由内到外:先执行里面的 input() 拿到字符串 "18",再交给外面的 int() 转成数字 18。看不习惯的话,拆成两行完全等价:
text = input("请输入你的年龄:") # 拿到字符串
age = int(text) # 转成整数
可能带小数的输入(身高、价格、体重)用 float():
height = float(input("请输入身高(米):"))
那用户乱输入怎么办? 输入 abc 再转 int(),程序会带着 ValueError 崩溃——这是正常现象,2.1 就见过这个报错。现阶段不用处理它,第 8 章异常处理会教你优雅地接住这种错误,现在测试时输入合法数字就好。
选择转换函数的原则一句话:要文本不转,要整数 int(),可能带小数 float()。
综合小例子:BMI 计算器
把这一章学的东西全部串起来——变量、运算、f-string、输入输出。新建 bmi.py:
# bmi.py — 计算身体质量指数
# BMI = 体重(kg) ÷ 身高(m) 的平方
name = input("你的名字:") # 文本,不转
height = float(input("身高(米):")) # 可能带小数,float
weight = float(input("体重(公斤):")) # 可能带小数,float
bmi = weight / height ** 2 # ** 优先级比 / 高,先算平方
print(f"{name},你的 BMI 是 {bmi:.1f}") # :.1f 保留 1 位小数
运行效果:
你的名字:小明
身高(米):1.75
体重(公斤):65
小明,你的 BMI 是 21.2
逐行核对一下你是否能说出每个细节的"为什么":
- 为什么
name不套转换函数?——名字就是文本,不需要计算 - 为什么身高体重用
float()不用int()?——1.75 转int()会直接 ValueError(还记得吗?int()不接受带小数点的字符串) - 为什么
height ** 2不用加括号?——**优先级高于/;不过写成weight / (height ** 2)更清晰,也完全可以 bmi:.1f是什么?——f-string 保留 1 位小数
五行核心代码,覆盖了第 2 章的全部知识点。能独立看懂并写出它,这一章就算过关了。
练习
1. 询问用户的出生年份,计算并输出"你今年 X 岁"(假设今年是 2026 年)。
2. 写一个"复读机":用户输入什么,程序原样输出,前面加上"你说:"。想一想:这题的 input 需要转类型吗?
3. 矩形面积计算器:输入长和宽(可能是小数),输出面积,保留 2 位小数。
4. 下面的程序想算两个数的和,但用户输入 3 和 5 后,输出的是 35 而不是 8。解释原因并修好它:
a = input("第一个数:")
b = input("第二个数:")
print("和是:", a + b)
点击查看答案
# 1
year = int(input("你的出生年份:"))
print(f"你今年 {2026 - year} 岁")
# 2 —— 不需要转类型:复读的是文本,input 给的正好就是文本
words = input("请输入:")
print(f"你说:{words}")
# 3
length = float(input("长:"))
width = float(input("宽:"))
print(f"面积是 {length * width:.2f}")
第 4 题: input() 返回的是字符串,"3" + "5" 是字符串拼接,得到 "35"。转成数字再相加:
a = int(input("第一个数:"))
b = int(input("第二个数:"))
print("和是:", a + b) # 和是: 8
本章小结
print()可以逗号连打多个值;sep改分隔符,end改行尾input("提示语"):显示提示 → 暂停等输入 → 回车后返回输入内容input()返回的永远是字符串——要计算就转类型,int(input())/float(input())是标准写法- 嵌套调用由内到外执行;转换失败会 ValueError(第 8 章教你处理)
- BMI 计算器 = 本章知识大集合,务必亲手写一遍
基础语法四节全部完成!你已经能写出"有输入、有计算、有输出"的完整小程序了。下一章给程序装上大脑,让它学会自己做判断:3.1 条件判断 if