跳到主要内容

2.4 输入与输出

到目前为止,我们程序里的数据都是写死在代码里的——想换个名字、换个数字,就得改代码。真正的程序不是这样的:计算器等你按数字,网页等你填表单,游戏等你操作。程序要能跟用户对话

  • 输出:程序对用户说话 → print()
  • 输入:用户对程序说话 → input()

print() 已经用了很多次,先把它的隐藏技能补齐,再学新主角 input()

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("请输入你的名字:")
  1. input() 先把括号里的提示语显示出来(告诉用户该干嘛,不写提示语用户会对着空屏幕发呆)
  2. 程序暂停,等用户输入并按回车
  3. 用户输入的内容成为 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