返回博客

04. 输入与输出:print() 和 input() 完全指南

04. 输入与输出:print() 和 input() 完全指南

第四篇:输入与输出——print() 和 input() 完全指南

前言

到目前为止,我们已经学会了如何搭建 Python 环境并写出第一个程序。现在我们要进入更深入的阶段:让程序真正地与我们交互。本文将全面讲解 print() 函数的各种用法(包括分隔符、结束符、格式化输出)和 input() 函数的使用方法,以及如何通过类型转换编写实用的交互程序。

print() 是 Python 中最常用的内置函数之一,它负责将内容输出到终端。

基础输出

# 最简单的用法:直接输出字符串
print("Hello, World!")

# 输出数字
print(42)

# 同时输出多个对象(用空格分隔)
print("年龄:", 25, "岁")

输出结果:

Hello, World!
42
年龄:25 岁

注意:默认情况下,print() 在多个参数之间插入一个空格作为分隔符。

sep 参数:自定义分隔符

sep 参数定义了多个值之间的分隔方式。默认值为空格 " "。

# 使用默认空格分隔
print("Python", "Java", "C++")
# 输出:Python Java C++

# 使用逗号分隔
print("Python", "Java", "C++", sep=", ")
# 输出:Python, Java, C++

# 使用连字符分隔
print("2026", "09", "09", sep="-")
# 输出:2026-09-09

# 使用制表符分隔
print("姓名", "年龄", "城市", sep="\t")
# 输出:姓名	年龄	城市

# 去掉分隔符
print("H", "e", "l", "l", "o", sep="")
# 输出:Hello

# 多级分隔(适合表格数据)
print("姓名", "年龄", "职业", sep=" | ")

end 参数:自定义结尾符号

end 参数定义了一行输出结束后追加的字符。默认值为换行符 "\n"。

# 默认行为:每行自动换行
print("第一行")
print("第二行")
# 输出:
# 第一行
# 第二行

# 不使用换行,在同一行显示
print("加载中", end="...")
print("完成!", end="\n\n")
# 输出:加载中...完成!

# 使用等号填充边框
for i in range(5):
    print("*", end="")
print()  # 添加一个空行
# 输出:*****

flush 参数:强制刷新缓冲区

# 实时显示计数过程
import time
for i in range(5):
    print(i, end=" ", flush=True)  # 立即输出到屏幕
    time.sleep(1)
# 输出:0 1 2 3 4 (每秒递增)

默认情况下,print() 会将输出暂存到缓冲区中,达到一定大小后才批量输出。设置 flush=True 可以强制立即输出,适用于实时显示场景。

字符串格式化输出

Python 提供了多种字符串格式化方式,每种都有适用的场景。

f-string(推荐方式)

f-string 是 Python 3.6+ 引入的最简洁强大的格式化方式:

name = "小明"
age = 25
height = 1.75

# 基础 f-string
print(f"我叫 {name},今年 {age} 岁")

# 包含数学表达式
print(f"身高 {height} 米 = {height * 100} 厘米")

# 多行 f-string
info = f"""姓名:{name}
年龄:{age}
身高:{height}m"""
print(info)

# 限制小数位数
price = 19.9
tax = price * 0.13
print(f"价格:{price:.2f} 元,税费:{tax:.2f} 元")
# 输出:价格:19.90 元,税费:2.59 元

# 对齐和填充
name = "张三"
print(f"[{' ':<10}] {name}")
# 输出:[          ] 张三

# 数字格式
number = 1234567
print(f"金额:¥{number:,}")
# 输出:金额:¥1,234,567

percentage = 0.856
print(f"完成率:{percentage:.1%}")
# 输出:完成率:85.6%

f-string 的优势:

  • 语法最简洁直观
  • 支持任意 Python 表达式
  • 性能优于 .format() 和 % 运算符
  • 可以直接调用方法和访问属性

.format() 方法

.format() 是较旧的格式化方式,仍然广泛使用:

# 位置参数
print("{} {} {}".format("I", "love", "Python"))
# 输出:I love Python

# 索引参数
print("{1} {0}".format("World", "Hello"))
# 输出:Hello World

# 命名参数
print("姓名:{name}, 年龄:{age}".format(name="小红", age=22))

# 混合格式
print("{0} {1} {0}".format("hello", "world"))
# 输出:hello world hello

% 运算符(旧式风格)

这是受 C 语言 printf 影响的传统方式:

# %s 字符串,%d 整数,%f 浮点数
name = "小明"
age = 25
score = 95.5

print("姓名:%s,年龄:%d,分数:%.1f" % (name, age, score))
# 输出:姓名:小明,年龄:25,分数:95.5

格式说明符速查表

格式符 含义 示例 输出
{:.2f} 固定 2 位小数 3.14159 3.14
{:+.2f} 带正负号 -5.2 -5.20
{:.0%} 百分比 0.85 85%
{:,.2f} 千分位 +2 位小数 1234567.8 1,234,567.80
{:>10} 右对齐,宽度 10 "Hi" Hi
{:<10} 左对齐,宽度 10 "Hi" Hi
{:^10} 居中,宽度 10 "Hi" Hi
{:x} / {:X} 十六进制小/大写 255 ff / FF

input() 函数:获取用户输入

input() 用于从键盘读取用户的输入,返回值永远是字符串类型。

基本用法

# 不带提示文字
username = input()
print(f"欢迎回来,{username}!")

# 带提示文字(更常见)
password = input("请输入密码:")
print("密码已记录")

# 读取数字需要转换类型
age = int(input("请输入你的年龄:"))
print(f"你明年将 {age + 1} 岁")

数据类型转换

# 转换为整数
num = int(input("输入一个整数:"))
print(f"平方:{num ** 2}")

# 转换为浮点数
temperature = float(input("当前温度:"))
print(f"摄氏度:{temperature}°C")

# 转换为布尔值(非零为 True,0 为 False)
is_active = bool(int(input("是否激活(0/1):")))
print(f"状态:{'已激活' if is_active else '未激活'}")

# 转换为列表
numbers = list(map(int, input("输入数字,空格分隔:").split()))
print(f"总和:{sum(numbers)}")
# 输入:1 2 3 4 5 → 输出:总和:15

# 转换为字典(高级用法)
pairs = input("输入键值对,逗号分隔(key=value):")
data = dict(pair.split("=") for pair in pairs.split(","))
print(data)
# 输入:name=小明,age=25 → {'name': '小明', 'age': '25'}

处理无效输入

# 方式一:条件判断
while True:
    age_str = input("请输入年龄(正整数):")
    if age_str.isdigit():
        age = int(age_str)
        print(f"你输入了:{age}")
        break
    else:
        print("错误:请输入有效的数字!")

# 方式二:try-except 异常处理(推荐)
while True:
    try:
        age = int(input("请输入年龄:"))
        print(f"你输入了:{age}")
        break
    except ValueError:
        print("错误:请输入有效的整数!请重试。")

综合实战:交互式程序

让我们把所学组合起来,编写几个实用的小程序。

程序一:简易 BMI 计算器

print("=" * 40)
print("BMI 身体质量指数计算器")
print("=" * 40)

name = input("请输入你的名字:")
height_cm = float(input("请输入你的身高(厘米):"))
weight_kg = float(input("请输入你的体重(公斤):"))

height_m = height_cm / 100
bmi = weight_kg / (height_m ** 2)

print(f"\n{'-' * 30}")
print(f"你好,{name}!")
print(f"你的 BMI 值是:{bmi:.1f}")
print(f"健康范围:18.5 - 24.9")
print(f"{'-' * 30}")

if bmi < 18.5:
    print("状态:偏瘦 📉")
elif bmi <= 24.9:
    print("状态:正常 ✅")
else:
    print("状态:偏胖 📈")

运行效果:

========================================
BMI 身体质量指数计算器
========================================
请输入你的名字:小明
请输入你的身高(厘米):175
请输入你的体重(公斤):70
------------------------------
你好,小明!
你的 BMI 值是:22.9
健康范围:18.5 - 24.9
------------------------------
状态:正常 ✅

程序二:命令行待办清单

todos = []

print("📝 待办事项管理器")
print("输入 'quit' 退出,'list' 查看,'done' 标记完成")

while True:
    action = input("\n操作:").strip().lower()
    
    if action == "quit":
        break
    
    elif action == "list":
        if todos:
            for i, (task, done) in enumerate(todos, 1):
                status = "✅" if done else "⬜"
                print(f"{i}. [{status}] {task}")
        else:
            print("暂无任务")
    
    elif action == "done":
        try:
            num = int(input("完成第几项?:"))
            todos[num - 1][1] = True
            print("已标记完成 ✅")
        except (ValueError, IndexError):
            print("无效编号")
    
    else:
        todos.append([action, False])
        print(f"已添加:{action}")

print("\n感谢使用,再见!👋")

程序三:温度单位转换器

def convert_temperature(value, from_unit, to_unit):
    """温度单位转换工具函数"""
    celsius = None
    # 转为摄氏度
    if from_unit.upper() == "C":
        celsius = value
    elif from_unit.upper() == "F":
        celsius = (value - 32) * 5 / 9
    elif from_unit.upper() == "K":
        celsius = value - 273.15
    else:
        return "未知单位"
    
    # 从摄氏度转出
    if to_unit.upper() == "C":
        return celsius
    elif to_unit.upper() == "F":
        return celsius * 9 / 5 + 32
    elif to_unit.upper() == "K":
        return celsius + 273.15
    return "未知单位"

print("=== 温度单位转换器 ===")
temp = float(input("温度数值:"))
from_u = input("原始单位(C/F/K):")
to_u = input("目标单位(C/F/K):")
result = convert_temperature(temp, from_u, to_u)

print(f"{temp}°{from_u} = {result:.2f}°{to_u}")

测试:

温度数值:100
原始单位(C/F/K):C
目标单位(C/F/K):F
100.0°C = 212.00°F

常见问题与排查

TypeError: 类型不匹配

# 错误:不能直接将字符串和整数相加
age = input("年龄:")       # 返回 "25"
print("明年" + age + "岁")  # TypeError!

# 正确:先转换为整数再运算
age = int(input("年龄:"))
print(f"明年 {age + 1} 岁")

EOFError: 意外文件结束

当程序没有从键盘接收到预期的输入时(如在某些 IDE 中输入框关闭),会抛出此异常:

try:
    name = input("你的名字:")
except EOFError:
    print("没有收到输入,使用默认值")
    name = "匿名用户"

中文编码问题

在某些 Windows 系统中,input() 可能因编码问题报错:

# 如果遇到问题,可以在脚本开头添加
# coding: utf-8

确保编辑器保存文件时使用 UTF-8 编码,这通常能解决大多数中文相关问题。

总结

本文涵盖了 Python 输入输出的核心知识:

  1. print() 函数:掌握 sep、end、flush 参数的灵活使用
  2. 字符串格式化:优先使用 f-string(f"text {var}"),理解其优于 .format() 和 % 的原因
  3. input() 函数:始终记住返回值是字符串,需手动转换类型
  4. 异常处理:用 try-except 或 isdigit() 验证用户输入
  5. 实战技巧:将以上知识点组合,编写有实际价值的交互程序

下一篇文章将深入讲解 Python 的数据类型:整数、浮点数、布尔值等基础数值类型的特性与运算。


本文是 Python 教程系列的第四篇。