输入与输出
本节定位
这一节让程序开始和用户互动。你会学会用 input 接收信息、用 print 展示结果,并掌握 f-string 格式化输出,为后面的命令行工具、API 调试和结果展示打基础。
学习目标
- 掌握
print()的各种用法和格式化输出 - 学会用
input()获取用户输入 - 理解 f-string 格式化的高级用法
- 能编写简单的交互式程序
先看一个小程序
name = input("请输入你的名字: ")
age = int(input("请输入你的年龄: "))
print(f"你好,{name}!")
print(f"你出生于大约 {2026 - age} 年")
print(f"10 年后你就 {age + 10} 岁了")
运行效果:
请输入你的名字: 小明
请输入你的年龄: 25
你好,小明!
你出生于大约 2001 年
10 年后你就 35 岁了
这就是最基本的输入输出——input() 负责接收数据,print() 负责展示结果。
print() 详解
print() 是你最常用的函数,没有之一。
print() 基本用法
# 打印字符串
print("Hello, World!")
# 打印数字
print(42)
print(3.14)
# 打印变量
name = "Python"
print(name)
# 打印表达式的结果
print(1 + 2 + 3) # 6
打印多个值
# 用逗号分隔,print 会自动用空格连接
print("姓名:", "小明", "年龄:", 25)
# 输出: 姓名: 小明 年龄: 25
# 自定义分隔符
print("2026", "01", "15", sep="-")
# 输出: 2026-01-15
print("apple", "banana", "cherry", sep=" | ")
# 输出: apple | banana | cherry
控制换行
# 默认每个 print 之后会换行
print("第一行")
print("第二行")
# 输出:
# 第一行
# 第二行
# 用 end 参数改变结尾字符
print("Hello", end=" ")
print("World")
# 输出: Hello World(在同一行)
# 用 end 实现简单的进度显示
print("加载中", end="")
print(".", end="")
print(".", end="")
print(".", end="")
print(" 完成!")
# 输出: 加载中... 完成!
打印特殊字符
# 换行符 \n
print("第一行\n第二行\n第三行")
# 输出:
# 第一行
# 第二行
# 第三行
# 制表符 \t(用来对齐)
print("姓名\t年龄\t城市")
print("张三\t25\t北京")
print("李四\t30\t上海")
# 输出:
# 姓名 年龄 城市
# 张三 25 北京
# 李四 30 上海
# 反斜杠本身 \\
print("文件路径: C:\\Users\\Desktop")
# 原始字符串(不处理转义 )
print(r"文件路径: C:\Users\Desktop") # r 前缀表示原始字符串
f-string 格式化(重点)
f-string 是 Python 3.6 引入的字符串格式化方式,也是目前最推荐的方式。
f-string 基本用法
name = "小明"
age = 25
score = 92.567
# 在字符串前加 f,花括号里放变量名
print(f"我叫{name},今年{age}岁")
# 输出: 我叫小明,今年25岁
# 花括号里可以放任何表达式
print(f"明年我 {age + 1} 岁")
print(f"名字有 {len(name)} 个字")
print(f"及格了吗?{'是' if score >= 60 else '否'}")
数字格式化
这是 f-string 最强大的功能之一:
# 控制小数位数
pi = 3.141592653589793
print(f"π = {pi:.2f}") # 3.14(保留 2 位小数)
print(f"π = {pi:.4f}") # 3.1416(保留 4 位小数)
# 百分比
accuracy = 0.8734
print(f"准确率: {accuracy:.1%}") # 87.3%
print(f"准确率: {accuracy:.2%}") # 87.34%
# 千分位分隔
population = 1400000000
print(f"人口: {population:,}") # 1,400,000,000
print(f"人口: {population:_}") # 1_400_000_000
# 科学计数法
speed_of_light = 299792458
print(f"光速: {speed_of_light:.2e} m/s") # 3.00e+08 m/s
# 整数补零
for i in range(1, 4):
print(f"第 {i:03d} 集") # 第 001 集、第 002 集、第 003 集
对齐和填充
# 左对齐、右对齐、居中
name = "Python"
print(f"|{name:<20}|") # |Python | 左对齐
print(f"|{name:>20}|") # | Python| 右对齐
print(f"|{name:^20}|") # | Python | 居中
# 用指定字符填充
print(f"|{name:*<20}|") # |Python**************|
print(f"|{name:*>20}|") # |**************Python|
print(f"|{name:*^20}|") # |*******Python*******|
# 实际应用:打印一个简单的表格
print(f"{'姓名':<10}{'分数':>10}")
print("-" * 20)
print(f"{'张三':<10}{95:>10}")
print(f"{'李四':<10}{87:>10}")
print(f"{'王五':<10}{92:>10}")
输出:
姓名 分数
--------------------
张三 95
李四 87
王五 92
格式化速查表
| 格式 | 含义 | 示例 | 结果 |
|---|---|---|---|
:.2f | 保留 2 位小数 | f"{3.14159:.2f}" | 3.14 |
:.1% | 百分比(1 位小数) | f"{0.873:.1%}" | 87.3% |
:, | 千分位分隔 | f"{1000000:,}" | 1,000,000 |
:.2e | 科学计数法 | f"{12345:.2e}" | 1.23e+04 |
:03d | 补零到 3 位 | f"{5:03d}" | 005 |
:<10 | 左对齐,宽度 10 | f"{'hi':<10}" | hi________ |
:>10 | 右对齐,宽度 10 | f"{'hi':>10}" | ________hi |
:^10 | 居中,宽度 10 | f"{'hi':^10}" | ____hi____ |
input() 获取用户输入
input() 会暂停程序,等待用户输入,然后返回用户输入的字符串。
input() 基本用法
# input() 返回的始终是字符串!
name = input("请输入你的名字: ")
print(f"你好,{name}!")
print(type(name)) # <class 'str'>
重要:input() 返回的是字符串
# 常见陷阱
age = input("请输入年龄: ") # 用户输入 25
print(type(age)) # <class 'str'>,不是 int!
# 如果直 接做数学运算会出问题
# print(age + 1) # 报错!字符串不能加数字
# 正确做法:先转换类型
age = int(input("请输入年龄: ")) # 输入的同时转成整数
print(f"明年你 {age + 1} 岁")
# 如果需要浮点数
height = float(input("请输入身高(米): "))
print(f"你的身高是 {height} 米")
处理非法输入
用户可能输入你预期之外的内容:
# 用户输入了 "abc" 而不是数字
# age = int(input("请输入年龄: ")) # 会报 ValueError!
# 安全的做法(后面学了异常处理会更优雅)
user_input = input("请输入一个数字: ")
if user_input.isdigit():
number = int(user_input)
print(f"你输入的数字是: {number}")
else:
print("这不是一个有效的数字!")
综合案例
案例 1:简易计算器
print("=== 简易计算器 ===")
num1 = float(input("请输入第一个数: "))
num2 = float(input("请输入第二个数: "))
print(f"\n计算结果:")
print(f"{num1} + {num2} = {num1 + num2}")
print(f"{num1} - {num2} = {num1 - num2}")
print(f"{num1} × {num2} = {num1 * num2}")
if num2 != 0:
print(f"{num1} ÷ {num2} = {num1 / num2:.2f}")
else:
print("除数不能为 0!")
案例 2:AI 训练报告生成器
# 模拟训练结果数据
model_name = "ResNet-50"
total_epochs = 100
train_accuracy = 0.9534
val_accuracy = 0.9187
train_loss = 0.1245
val_loss = 0.2891
training_hours = 2.5
# 生成格式化的报告
print("=" * 40)
print(f"{'模型训练报告':^40}")
print("=" * 40)
print(f"模型名称: {model_name}")
print(f"训练轮数: {total_epochs}")
print(f"训练准确率: {train_accuracy:.2%}")
print(f"验证准确率: {val_accuracy:.2%}")
print(f"训练损失: {train_loss:.4f}")
print(f"验证损失: {val_loss:.4f}")
print(f"训练时长: {training_hours:.1f} 小时")
print("-" * 40)
# 判断模型状态
gap = train_accuracy - val_accuracy
if gap > 0.05:
print(f"⚠️ 过拟合风险: 训练/验证差距 {gap:.2%}")
else:
print(f"✅ 模型状态良好: 训练/验证差距 {gap:.2%}")
print("=" * 40)
输出:
========================================
模型训练报告
========================================
模型名称: ResNet-50
训练轮数: 100
训练准确率: 95.34%
验证准确率: 91.87%
训练损失: 0.1245
验证损失: 0.2891
训练时长: 2.5 小时
----------------------------------------
⚠️ 过拟合风险: 训练/验证差距 3.47%
========================================
动手练习
练习 1:自我介绍生成器
写一个程序,接收用户的姓名、年龄、城市、爱好,然后生成格式化的自我介绍:
name = input("你的名字: ")
age = int(input("你的年龄: "))
city = input("你的城市: ")
hobby = input("你的爱好: ")
# 在下方生成自我介绍
print("=" * 30)
# ... 补充代码
print("=" * 30)
练习 2:购物小票
# 输入商品信息
item1 = "Python 教材"
price1 = 59.9
qty1 = 2
item2 = "笔记本"
price2 = 15.5
qty2 = 3
# 打印购物小票,要求:
# 1. 商品名左对齐,价格右 对齐
# 2. 显示每项小计
# 3. 最后显示总计
# 提示:使用 f-string 对齐功能
练习 3:单位转换器
写一个程序,让用户输入公里数,然后输出对应的英里数和米数:
km = float(input("请输入公里数: "))
# 1 公里 = 0.621371 英里
# 1 公里 = 1000 米
# 补充代码,输出格式:保留 2 位小数
小结
| 函数/语法 | 用途 | 关键点 |
|---|---|---|
print() | 输出信息 | sep 改分隔符,end 改结尾 |
input() | 获取用户输入 | 返回值始终是字符串 |
f"..." | 格式化字符串 | {变量:格式} 控制显示方式 |
int() / float() | 类型转换 | input() 后通常需要转换 |
核心理解
输入和输出是程序与外界交互的窗口。 input() 让程序变得灵活(不同输入不同结果),print() 加上 f-string 格式化让输出变得专业美观。写代码时多用 print() 来查看中间结果,这是最基本的调试手段。