一个 print 函数,挺会玩啊?
我有时候真觉得 Python 这个 print(),表面上看就一个“输出一下”的小工具,结果越用越发现它背地里藏了不少小心思。就像公司里那个每天看起来很安静的小同事,关键时候整点狠活儿出来。
下面我就跟你随便聊聊这个“小家伙”到底能玩些什么花样。
print 不只是“显示文本”
你第一次接触 Python,大概率是这样:
print("Hello world")
然后你以为它的使命就结束了?
其实 print() 默认做了三件事:
把东西转成字符串 输出到 标准输出(stdout) 自动在最后加一个换行
也就是说,你啥都不配置,它就在背地里帮你“润色”好。
print("A")
print("B")
默认输出:
A
B
但如果你不想换行呢?
print("A", end="")
print("B")
输出:
AB
看吧,一个 end 参数就能让它变形。
它还懂“分隔符”这种社交礼仪
给你个需求:你要输出一串内容,但不想用默认空格隔开。
没关系,print() 直接把人家安排明白:
print("2025", "01", "12", sep="-")
输出:
2025-01-12
它这分隔符功能用一次你就回不去,尤其是生成文件名、日志前缀的时候特别香。
print 可以输出到任何地方
你以为它只能“打印到屏幕”?No no no,这孩子其实“多才多艺”。
比如把内容写进文件:
with open("log.txt", "w") as f:
print("系统启动成功", file=f)
只需要改一个 file= 参数,输出位置就从屏幕变到文件里。
甚至你给它传 socket、StringIO、日志流,它都能乖乖把内容送进去。
它还能当“临时调试器”
这可能是全世界程序员都最爱用的技巧:**在关键地方塞一个 print()**。
比如:
defprocess(item):
print("[Debug] item =", item)
# 后面一堆复杂逻辑...
虽然 IDE 里有断点,但你知道的 —— print 不会卡住程序,不会丢线程上下文,也不会让你跳来跳去。
而且 print 天然线程安全,还能带着时间戳自己封一个:
from datetime import datetimedeflog(msg):
print(f"{datetime.now()} - {msg}")
不需要 logging 模块也能搞个迷你日志系统。
动态刷新输出?print 也能玩
比如你想实现“加载中......”那种动态效果:
import timefor i in range(5):
print(f"\r加载中 {'.' * (i+1)}", end="")
time.sleep(0.5)
运行时界面是闪动的,完全不换行。
你说这不是带点“UI 控件味儿”了吗?
print 还能捕获变量结构,非常适合 debug
Python3.8 给 print 搞了个隐藏技能——f-string debug 格式。
x = 42
print(f"{x=}")
输出:
x=42
甚至还能打印表达式:
print(f"{3 * x=}")
输出:
3 * x=126
这功能简直像是 Python 官方看不下大家到处写 debug print,自带优化了解。
再偷偷告诉你一个骚操作:重写 print
你以为它只是内置函数?其实你能换掉它。
比如你想加上统一前缀:
import builtins_old_print = print
defprint(*args, **kwargs):
_old_print("[MyApp]", *args, **kwargs)
以后所有 print 都长这样:
[MyApp] 处理完成
是不是立刻有点“框架感”了?
最后,print 还能被“禁用”
有时候你跑脚本不想它乱输出,你可以直接:
import sys
sys.stdout = open("/dev/null", "w")
或者 Windows:
sys.stdout = open("NUL", "w")
print 再多也没声音了,就像把吵闹孩子的麦给关掉。
你看,明明只是一个 print(),结果功能一点不简单。 输出、格式化、到处写入、调试、动态刷新、甚至还能被重写……
可以说它是 Python 中最容易被低估的小角色。
你以后再写 print("hello"),大概也会想起它这堆隐藏技能了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB