007、Python基本输入与输出:与程序交互的第一步
007、Python基本输入与输出:与程序交互的第一步
昨天帮实习生调试代码,看到这么一段:
name = input("输入姓名")
print("欢迎" + name)
运行后终端卡住不动,他反复检查语法,最后才发现控制台里早有一行浅灰色的“输入姓名”等着——原来程序一直在等他输入,他却以为程序挂了。这个场景让我想起自己刚学Python时,也曾在输入输出这种“简单”环节栽过跟头。今天我们就聊聊如何让程序开口说话、听懂人话。
输出不只是print
大多数人学Python输出就只记一个print,其实单是这个函数就有不少门道。先看这段代码:
# 新手常见写法,输出三行内容
print("用户列表:")
print("张三")
print("李四")
更地道的写法其实是:
# 一次print搞定多行,end参数控制行尾符
print("用户列表:", "张三", "李四", sep="\n")
sep参数控制多个值之间的分隔符,默认是空格。end参数控制输出结尾的字符,默认是换行符。这两个参数用好了,能避免很多奇怪的格式问题。
调试时我经常这样用:
# 调试专用,加个前缀方便识别
def debug_print(*args):
print("[DEBUG]", *args, sep=" | ")
输出时会自动带上[DEBUG]标记,在日志洪流中一眼就能找到自己的调试信息。
格式化输出的演进
Python的字符串格式化经历了三代演变。老项目里可能会看到这种:
# 第一代:C风格,现在不推荐了
print("用户%s,年龄%d" % ("张三", 25))
目前主流的是这两种:
# 第二代:str.format(),清晰但稍显啰嗦
print("用户{},年龄{}".format("张三", 25))
print("用户{name},年龄{age}".format(name="张三", age=25))
# 第三代:f-string,Python 3.6+推荐
name = "张三"
age = 25
print(f"用户{name},年龄{age}")
f-string不仅写起来简洁,执行效率也比前两种高。有个细节要注意:花括号里可以直接写表达式,比如f"明年{age+1}岁"。
输入的那些坑
input()函数看似简单,但实际使用中陷阱不少。先看这个典型错误:
# 危险!用户输入什么就是什么
age = input("请输入年龄:")
if age > 18: # 这里会报类型错误
print("成年人")
input()返回的永远是字符串,即使你输入的是数字。必须显式转换:
age = int(input("请输入年龄:")) # 但这样又有新问题
如果用户输入的不是数字,程序会崩溃。稳妥的做法是:
while True:
try:
age = int(input("请输入年龄:"))
break
except ValueError:
print("请输入有效的数字")
生产环境的输入校验要比这复杂得多,但核心思路不变:永远不要相信用户的输入。
实际场景中的组合使用
去年给嵌入式设备写配置工具时,需要这样的交互:
print("=" * 40)
print("设备配置向导")
print("=" * 40)
config = {}
config['ip'] = input("请输入IP地址(默认192.168.1.1):") or "192.168.1.1"
config['port'] = input("请输入端口号(默认8080):") or "8080"
print(f"\n即将应用配置:")
for key, value in config.items():
print(f" {key}: {value}")
confirm = input("\n确认配置?(y/n): ")
if confirm.lower() == 'y':
print("配置已保存")
else:
print("配置已取消")
这里用到了几个技巧:or运算符提供默认值、for循环遍历字典、lower()统一大小写。实际工业场景中,还会加入超时机制——设备不能无限期等待用户输入。
一些经验之谈
-
调试时别只用print,试试在关键位置加
print(repr(data)),repr()会显示数据的原始形态,能帮你发现字符串里的隐藏字符。 -
处理用户输入前先trim,很多人习惯在输入前后加空格:
input().strip()能省去后续很多麻烦。 -
面向中文用户的提示信息,记得在冒号后用全角空格,视觉上更舒服:“请输入姓名:”而不是“请输入姓名:”。
-
写命令行工具时,考虑用sys.stdout.write()代替print,这样能精细控制输出位置,实现进度条效果。
-
重要提示用不同颜色输出(虽然标准库不支持),至少可以用大写或符号强调:“>>> 警告:此操作不可逆 <<<”。
记得刚入行时,导师说“输入输出是程序与真实世界的接口”。这些年深有体会——再复杂的算法,最终也要通过几行print让人理解;再智能的系统,也要从input获取真实需求。把这些基础打扎实,后面学文件操作、网络通信时,你会发现核心逻辑一脉相承。下次我们聊文件读写,你会发现那不过是换了个地方的输入输出而已。
更多推荐


所有评论(0)