Python中input()与print()函数的详细用法及示例

阿麦
阿麦
发布时间:2026-10-27 | 2人浏览过
原创

深入解析Python中input()与print()函数的核心用法、底层机制与实践技巧。涵盖参数配置、类型转换、输出缓冲机制、安全防范与完整代码示例。

在 Python 命令行与交互式脚本开发中,input() 和 print() 分别承担着标准输入与标准输出的核心职责。理解它们不仅在于记住基础语法,更在于掌握 input() 的字符串本质与类型安全转换、以及 print() 的分隔符、换行控制、输出重定向和缓冲区刷新机制。本文将系统拆解两个函数的完整参数与运作机理,并提供详实的实战代码与避坑指南。

一、print() 函数:格式化输出与流控制

print() 函数用于将一个或多个对象转换成文本字符串并输出到指定流(默认为控制台标准输出)。虽然日常用法看似简单,但官方内置的 4 个关键字参数为精细控制输出格式与行为提供了强大支持。

1. 函数签名与参数说明

Python 中 print() 的完整签名如下:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
参数名 默认值 类型与作用
*objects 无 位置参数,支持传入零个、一个或多个待打印对象。输出时内部自动调用 str() 将其转为字符串。
sep ' '(单空格) 字符串类型,用于定义多个输出对象之间的分隔符。
end '\n'(换行符) 字符串类型,追加在所有对象打印完毕后的结尾字符。
file sys.stdout 具备 write(string) 方法的文件类对象,决定输出的目的地。
flush False 布尔值,指定是否强制立即刷新输出缓冲区,无需等待缓冲区满或遇到换行。

2. sep 参数:精细控制多项分隔

当向 print() 传入多个参数时,默认会使用单个空格隔开。通过指定 sep,可以自定义任意连接字符:

# 默认空格分隔
print("2026", "10", "26")

# 自定义短横线连接(如日期)
print("2026", "10", "26", sep="-")

# 无缝拼接
print("Python", "3", "12", sep="")

# 使用制表符对齐
print("编号", "名称", "状态", sep="\t")
示例运行输出
2026 10 26
2026-10-26
Python312
编号 名称 状态

3. end 参数:阻止自动换行与行内刷新

默认情况下,每次调用 print() 都会在末尾输出换行符 \n。将 end 设置为空字符串 "" 或空格,可以将多次打印保留在同一行中:

# 连续在同一行输出
for i in range(5):
    print(i, end=" -> ")
print("完成")
示例运行输出
0 -> 1 -> 2 -> 3 -> 4 -> 完成

4. file 与 flush:重定向输出与即时刷新机制

标准输出流通常带有行缓冲机制,即遇到 \n 时才会把内容刷新到终端屏幕上。如果将 end 设为非换行字符,或者在高延迟的 I/O 操作中,控制台可能出现延迟显示的卡顿现象。将 flush=True 可以绕过系统缓冲区,立即把内容呈现在屏幕上:

import sys
import time

# 动态倒计时效果:结合 \r(回车符覆盖当前行)与 flush=True
for remaining in range(3, 0, -1):
    print(f"系统就绪倒计时: {remaining} 秒...", end="\r", flush=True)
    time.sleep(1)
print("系统启动完成!                 ")

# 输出重定向到文件
with open("app_log.txt", "w", encoding="utf-8") as f:
    print("这是一条记录在日志文件中的运行时通知", file=f)
Python中input()与print()函数的详细用法及示例
图 1:print() 函数多阶段参数处理与缓冲区刷新管道

5. 现代格式化输出技巧

在实际工程中,建议优先使用 Python 3.6+ 引入的 f-string(格式化字符串字面值),它比传统的 % 操作符或 str.format() 更直观且运行性能更佳:

name = "Alice"
score = 98.456
level = 4

# 基础插值与浮点精度保留
print(f"学员: {name} | 得分: {score:.2f} | 等级: L{level}")

# 格式对齐与补零
print(f"订单编号: {1024:08d}")   # 补零至8位:00001024
print(f"{'项目':<10}{'状态':^8}{'耗时':>6}")
print(f"{'数据同步':<10}{'SUCCESS':^8}{'120ms':>6}")
示例运行输出
学员: Alice | 得分: 98.46 | 等级: L4
订单编号: 00001024
项目 状态 耗时
数据同步 SUCCESS 120ms

二、input() 函数:用户交互与安全类型转换

input() 函数是 Python 获取标准输入的基础手段。它会挂起当前程序的执行,等待用户在终端中输入一行文本并敲击回车键,然后捕获输入内容并恢复执行。

1. 函数签名与基本用法

user_response = input([prompt])

prompt 是一个可选参数。如果传入字符串,它将首先被打印到控制台作为提示信息,且末尾不自动换行,以便光标紧贴提示符等待用户键入:

name = input("请输入您的姓名: ")
print(f"你好,{name}!欢迎使用系统。")
核心铁律:input() 的返回值永远是字符串(str)
无论用户在终端中输入的是纯整数、浮点数、布尔值还是 JSON 数组,input() 返回的变量类型一律为 str。如果不经转换直接参与数学运算,将导致逻辑错误或直接引发 TypeError。

2. 常见类型转换模式与异常处理

将用户输入的字符串转换为数值类型时,必须使用显式类型转换函数,例如 int()、float()。但用户输入往往不可控,如果不加防护,非法输入会导致程序崩溃:

# 错误示例:直接相加会导致字符串拼接
# a = input("输入a: ")  # 输入 5
# b = input("输入b: ")  # 输入 3
# print(a + b)         # 输出 "53",而非 8

# 正确示例:显式转换并包裹异常捕获
user_input = input("请输入年龄(整数): ")
try:
    age = int(user_input)
    if age < 0 or age > 150:
        print("输入范围不合理,年龄应在 0 到 150 之间。")
    else:
        print(f"明年的年龄是: {age + 1} 岁")
except ValueError:
    print(f"格式错误:无法将 '{user_input}' 解析为整数!")

3. 进阶处理:单行读取多个数值

在算法题目或批量输入场景下,经常需要在一行内输入多个由空格或逗号分隔的数据。结合 str.split() 和 map() 可以高效拆解:

# 单行输入多个整数,以空格分隔,例如:"10 20 30"
raw_data = input("请输入三个整数(空格分隔): ")
try:
    x, y, z = map(int, raw_data.split())
    print(f"总和: {x + y + z},平均值: {(x + y + z) / 3:.2f}")
except ValueError:
    print("输入项数不足或包含非整数字符!")

# 列表推导式转换任意长度数字列表
scores = [float(item) for item in input("输入多门课成绩(逗号分隔): ").split(",") if item.strip()]
print(f"共录入 {len(scores)} 门成绩,最高分为: {max(scores)}")
安全警告:严禁对用户输入使用 eval()
初学者有时为了省去类型判断,喜欢使用 eval(input()) 自动转换类型。这是极其危险的安全漏洞。eval() 会把输入的字符串当做合法的 Python 代码执行。如果恶意用户输入 __import__('os').system('rm -rf /') 或读取敏感环境变量,整个系统将面临被彻底破坏或被盗取权限的风险。
Python中input()与print()函数的详细用法及示例
图 2:input() 输入流获取与安全校验生命周期

三、实战综合应用:构建健壮的控制台交互系统

掌握了两个函数的单点特性后,在实际项目中通常会将它们串联为“提示 - 获取 - 校验 - 计算 - 反馈”的闭环。下面通过两个典型实战案例展示如何设计高可用控制台交互逻辑。

案例 1:具备重试与范围验证的输入保护循环

直接转换输入极易因用户误触而使程序意外崩溃。生产级交互脚本通常采用 while True 循环,直到获得符合业务规则的输入才跳出:

def get_valid_score(subject_name: str) -> float:
    """获取指定科目的有效分数(0-100之间)"""
    while True:
        raw_val = input(f"请输入【{subject_name}】的成绩 (0-100): ").strip()
        
        # 退出条件检测
        if raw_val.lower() in ("q", "quit", "exit"):
            print("用户取消输入,程序退出。")
            raise SystemExit
            
        try:
            score = float(raw_val)
            if 0.0 <= score <= 100.0:
                return score
            print("【提示】分数超出有效范围,请输入 0 到 100 之间的数值!")
        except ValueError:
            print(f"【错误】无法解析输入内容 '{raw_val}',请输入合法的纯数字!")

# 调用示例
math_score = get_valid_score("高等数学")
print(f"录入成功!录入分数为: {math_score:.1f}")
示例运行交互过程
请输入【高等数学】的成绩 (0-100): abc
【错误】无法解析输入内容 'abc',请输入合法的纯数字!
请输入【高等数学】的成绩 (0-100): 120
【提示】分数超出有效范围,请输入 0 到 100 之间的数值!
请输入【高等数学】的成绩 (0-100): 88.5
录入成功!录入分数为: 88.5

案例 2:单行原地刷新的动态控制台进度条

通过组合 print(end='\r') 与 flush=True,可以在不刷屏的情况下就地更新终端状态,常用于耗时任务或批量下载提示:

import time

def progress_bar(total_steps: int = 20):
    print("开始执行任务处理...")
    for current in range(1, total_steps + 1):
        percent = (current / total_steps) * 100
        filled = int(30 * current // total_steps)
        bar = "█" * filled + "-" * (30 - filled)
        
        # \r 将光标移动到当前行行首,flush=True 强制立即推送到屏幕
        print(f"\r进度: [{bar}] {percent:5.1f}% ({current}/{total_steps})", end="", flush=True)
        time.sleep(0.08)
    
    print("\n所有任务分片执行完毕!")

progress_bar()
Python中input()与print()函数的详细用法及示例
图 3:交互式控制台应用程序的闭环数据与状态流转

四、常见问题排查与避坑指南

在日常编写控制台程序时,开发者常在类型、环境和缓冲区方面遇到意外行为。本节汇总了四个最高频的典型问题及对应解决途径。

1. 陷阱一:TypeError: can only concatenate str to str

这是 Python 初学者遭遇频率最高的问题之一。根源在于误以为用户输入了数字后 input() 就会得到数字变量:

# 错误场景:
price = input("输入单价: ")
count = input("输入数量: ")
# total = price * count  # 报错:TypeError: can't multiply sequence by non-int of type 'str'

# 正确写法:
unit_price = float(input("输入单价: "))
qty = int(input("输入数量: "))
total = unit_price * qty
print(f"应付总额: ¥{total:.2f}")

2. 陷阱二:EOFError: EOF when reading a line

当 Python 脚本运行在没有键盘标准输入的“无头环境”中(例如 Jenkins、GitLab CI/CD 流水线、Docker 后台容器或通过重定向输入 python script.py < empty.txt),一旦输入流被耗尽或根本不存在控制台输入端,input() 就会立即抛出 EOFError。

解决方案:在自动化或脚本任务中,不要强依赖键盘输入,优先考虑命令行参数(sys.argv 或 argparse 模块)或者环境变量(os.environ)。如果确实需要兼容两种模式,请捕获 EOFError 并赋予默认缺省值:

try:
    mode = input("请选择运行模式 (1-生产, 2-测试) [默认: 1]: ").strip()
    if not mode:
        mode = "1"
except EOFError:
    mode = "1"  # 无交互终端时的缺省降级策略
print(f"当前生效模式: {mode}")

3. 陷阱三:print 输出在控制台出现严重延迟

在编写耗时下载、网络请求或复杂模型推理时,循环体内调用了 print(".", end=""),却发现屏幕一片空白,直到整个任务全部结束时,所有点才“哗”地一下同时打印出来。

根本原因:当标准输出连接到某些非 TTY 终端、嵌入式 IDE 输出窗格或重定向到管道时,输出流会被设置为块缓冲(Block Buffering),容量通常为 4KB 或 8KB。在缓冲区塞满之前,任何内容都不会主动刷出。

解决方案:显式传入 flush=True,或者在启动 Python 解释器时增加 -u 命令行参数(即 python -u main.py),也可以在代码最开头设置环境变量 PYTHONUNBUFFERED=1。

4. 陷阱四:中英文字符在 print 输出时无法对齐

使用标准的字符串对齐(如 f"{name:<10}")时,英文字符宽度为 1 个半角字符,而全角中文汉字在终端显示时通常占据 2 个字符宽度。Python 的 str 长度统计依据的是字符数(len() 汉字也为 1),因此格式化占位符无法准确计算实际显示占位。

解决方案:使用标准库 unicodedata.east_asian_width() 计算字符串实际显示的终端列宽,或者采用第三方库 tabulate / rich 输出规整表格。

Python中input()与print()函数的详细用法及示例
图 4:input() 与 print() 高频疑难排错与最佳实践速查图

五、核心要点总结

控制台 I/O 虽然是 Python 最基础的组成部分,但编写健壮程序的关键在于对底层机制的敬畏与严谨的设计习惯:

  • print() 的灵活性:善用 sep 进行多段无缝或分隔拼装,利用 end 配合 \r 与 flush=True 达成平滑的单行动态刷新效果,遇到持久化需求时直接利用 file 参数重定向流。
  • input() 的字符串铁律:牢记 input() 永不返回除 str 之外的类型。所有数值运算、日期计算或布尔判断,都必须建立在显式类型转换与 try...except ValueError 防御机制之上。
  • 安全意识:坚决杜绝 eval(input()) 诱发的远程命令注入,解析结构化数据请选用 ast.literal_eval() 或 json.loads()。

通过遵循上述规范与流程模式,您的 Python 交互脚本将在健壮性、可读性以及终端用户体验上达到专业工程标准。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表