Python 系列(四) Python 输入输出详解,print()、input() 与常见避坑指南
1 | 作者:李晓辉 |
- Python 系列(一) 从零开始认识 Python,入门其实没那么难
- Python 系列(二) 学 Python 的第一步,把开发环境搭建好
- Python 系列(三) 基础语法避坑指南,缩进、大小写、续行与注释
- Python 系列(四) Python 输入输出详解,print()、input() 与常见避坑指南
- Python 系列(五) 数值类型与运算符详解,整除、浮点精度与进制转换实战
- Python 系列(六) 字符串处理实战,查找、替换、切片与日志分析
- Python 系列(七) 类型转换详解,int()、float()、str() 与金额计算避坑
- Python 系列(八) Python 流程控制入门,掌握 if、elif 和 else
- Python 系列(九) Python 逻辑运算符详解,and、or、not 一篇搞懂
- Python 系列(十) while、for 循环实战,彻底搞懂 range、break 与 continue
- Python 系列(十一) list、tuple、set、dict,到底该怎么选?
- Python 系列(十二) List 列表实战,搞定数据增删改查与批量处理
- Python 系列(十三) Tuple 元组实战,搞懂不可变特性与 enumerate() 遍历
- Python 系列(十四) Set 集合实战,搞定数据去重与集合运算
- Python 系列(十五) Dict 字典详解,掌握快速查找与键值操作
- Python 系列(十六) sort() 和 sorted() 详解,掌握数据排序技巧
- Python 系列(十七) 自定义函数入门,让重复代码一次编写多次使用
- Python 系列(十八) 函数参数详解,搞懂位置参数、关键字参数和默认参数
- Python 系列(十九) 从 *args 到 **kwargs,让函数调用更灵活
- Python 系列(二十) 变量作用域是什么?一文搞懂 global 和 nonlocal
- Python 系列(二十一) 搞懂变量、对象和引用,理解函数参数传递机制
- Python 系列(二十二) map() 和 filter() 详解,轻松实现批量数据处理与筛选
- Python 系列(二十三) 嵌套函数与 lambda 表达式详解,搞懂作用域与闭包
- Python 系列(二十四) 搞懂递归函数,从基线条件到实际应用
- Python 系列(二十五) 聊聊模块与 import,让代码告别重复编写
- Python 系列(二十六) Python 模块入门,从 import 到模块复用
- Python 系列(二十七) Python dir() 函数详解,快速查看模块中的函数与属性
- Python 系列(二十八) 不会用 Python 标准库?教你快速查找模块和函数
- Python 系列(二十九) 搞懂 Python sys 模块,让脚本更适合自动化运维
- Python 系列(三十) 为什么 0.1 + 0.2 不等于 0.3?彻底搞懂 Decimal
- Python 系列(三十一) 搞懂 datetime 日期时间,轻松处理时区与时间计算
- Python 系列(三十二) 面向对象编程入门,从零理解类、对象、封装与继承
- Python 系列(三十三) 什么是类和对象?零基础理解 Python class
- Python 系列(三十四) Python 属性详解,搞懂类属性、实例属性和 setter
- Python 系列(三十五) 学会特殊方法,让对象打印出你想要的内容
- Python 系列(三十六) 多个对象如何共享数据?彻底搞懂类变量
- Python 系列(三十七) 搞懂父类、子类和方法重写,真正理解继承与多态
- Python 系列(三十八) 如何判断数据类型?三个内置函数一次讲明白
- Python 系列(三十九) 搞懂异常模型与常见异常类型,读懂程序报错
- Python 系列(四十) 从零学会异常处理,掌握 try、except、else 和 finally
- Python 系列(四十一) ValueError、TypeError 到底是什么?一文搞懂常见异常
- Python 系列(四十二) ValueError、TypeError 到底是什么?一文搞懂常见异常
语法对了,程序才能跑起来;输入输出对了,程序才能和人、和系统对话。这一篇我们只讲两件事:怎么把信息打印出来,怎么从用户那里拿进来。看似基础,但在生产脚本里,print 的 sep 和 end 用错、input 返回永远是字符串这个特性没搞清,会导致无数低级 Bug。
上一篇我们搞定了大小写、缩进、续行和注释。从这一篇开始,我们进入 Python 的交互层,先把输出和输入的底层行为摸透。
简单输出:print 的默认行为
print() 能接受零个或多个参数,用逗号分隔。
1 | print("Hello", 123, "Goodbye", 5 + 9) |
运行结果:
1 | Hello 123 Goodbye 14 |
默认行为是:
- 多个参数时,每个参数之间用单个空格分隔
- 最后一个参数后自动换行
很多人第一次用 print 时会疑惑,为什么参数之间会自动加空格。答案就是默认的 sep=" "。
可选参数:sep、end、file
默认行为可以改。
sep:参数之间的分隔符
end:最后一个参数之后显示的字符,默认是换行 \n
file:输出的目标文件,后面章节再讲
实战例子:
1 | print("Hello", 123, "Goodbye", 5 + 9, sep=":", end="###") |
运行结果:
1 | Hello:123:Goodbye:14### |
没有换行,末尾是 ###。在写日志或做简易进度条时,end 用来避免每次都换行很有用。
我老李在写运维脚本时常用 sep 把多字段拼成 key:value 的简易格式,方便后续用 split 解析。
简单输入:input 的三大特性
input() 提供运行时从键盘获取用户输入的机制。它有三个必须记住的特性:
- 接受可选的提示字符串作为参数
- 自动删除键盘输入中的换行符
- 始终返回字符串
提示字符串的用法
1 | response = input("Please enter some text:") |
运行:
1 | Please enter some text: Hello |
response 的值是 Hello。
如果提示里本身带换行:
1 | response = input("Please enter some text:\n") |
运行:
1 | Please enter some text: |
提示会先换行,再等待输入。
输入永远是字符串
这是新手最容易踩的坑。
1 | response = input("Please enter a number: ") |
输入 456 后运行结果:
1 | Please enter a number: 456 |
即使你输入的是数字,input() 也会把它当成字符串返回。后面需要把它转成 int 或 float 才能做数学运算,否则会直接报 TypeError。
再看一个组合例子:
1 | response = input("Please enter some text:\n") |
运行:
1 | Please enter some text: |
这里用 sep=":" 把两部分连成一行。
flowchart LR
A[用户输入] --> B["input() 读取"]
B --> C{返回类型?}
C -->|始终| D[str 字符串]
D --> E[需要时手动转换]
E --> F[计算或处理]
F --> G["print() 输出"]
G --> H[屏幕/日志]生产环境常见坑与建议
- 忘记转换类型:
input返回字符串,直接+会拼接而不是相加。我建议在获取数值输入后立刻做int()或float()转换,并在转换时加try/except兜底。 - 多参数输出乱序:
print忽略参数间的额外空格,靠sep控制分隔符比手动加空格更可靠。 - 换行控制不当:写进度日志时用
end=""或end="\r",避免刷屏。 - 提示不清晰:交互脚本的提示要写完整,包含单位和示例,减少用户输入错误。
小练习思路
前面我们用 print 输出了信息,用 input 拿到了输入。现在可以把它们连起来:
- 提示用户输入名字和姓氏
- 用
print拼接成全名 - 再让用户输入年龄,打印出完整的个人信息
注意年龄需要先转成 int 才能判断是否合法。
1 | # 1. 提示输入名字和姓氏 |
1 | 请输入名字: 晓辉 |
写在最后
这一篇我们掌握了:
print()的默认行为和sep、end参数input()始终返回字符串,并自动去掉换行- 输入输出的组合使用是交互式脚本的基础
把输出和输入的边界搞清楚,下一步才能安心地讲数值类型和字符串方法。
