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()统一大小写。实际工业场景中,还会加入超时机制——设备不能无限期等待用户输入。

一些经验之谈

  1. 调试时别只用print,试试在关键位置加print(repr(data)),repr()会显示数据的原始形态,能帮你发现字符串里的隐藏字符。

  2. 处理用户输入前先trim,很多人习惯在输入前后加空格:input().strip()能省去后续很多麻烦。

  3. 面向中文用户的提示信息,记得在冒号后用全角空格,视觉上更舒服:“请输入姓名:”而不是“请输入姓名:”。

  4. 写命令行工具时,考虑用sys.stdout.write()代替print,这样能精细控制输出位置,实现进度条效果。

  5. 重要提示用不同颜色输出(虽然标准库不支持),至少可以用大写或符号强调:“>>> 警告:此操作不可逆 <<<”。

记得刚入行时,导师说“输入输出是程序与真实世界的接口”。这些年深有体会——再复杂的算法,最终也要通过几行print让人理解;再智能的系统,也要从input获取真实需求。把这些基础打扎实,后面学文件操作、网络通信时,你会发现核心逻辑一脉相承。下次我们聊文件读写,你会发现那不过是换了个地方的输入输出而已。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐