1. 从打印函数看Python的表达式求值机制
Python中最基础的print()函数实际上隐藏着许多值得深究的细节。我们先从一个简单的打印示例开始:
python复制print(3 + 4 * 2)
这段代码会输出11而不是14,因为Python解释器在将表达式传递给print()之前,已经按照运算符优先级完成了求值。这里涉及的关键概念是"表达式求值策略"——Python采用严格求值(Eager Evaluation)方式,这意味着所有子表达式在进入print函数前就已经被计算完毕。
1.1 打印多个值的参数解包
当我们需要同时打印多个值时,print()的*args参数特性就派上用场了:
python复制a, b = 10, 20
print(a, b, sep='|', end='!\n') # 输出:10|20!
这里有几个关键点需要注意:
- sep参数控制多个值之间的分隔符,默认是空格
- end参数指定行尾符号,默认是换行符\n
- 多个值会先被转换为字符串,然后按照sep连接
经验之谈:在需要生成特定格式日志时,合理设置sep和end参数可以避免后续的字符串拼接操作,这在性能敏感场景中尤为重要。
1.2 格式化输出的演进之路
Python的字符串格式化经历了多次演进,目前主要有三种方式:
- %-formatting(传统方式):
python复制print("Value: %0.2f, Count: %d" % (3.14159, 5))
- str.format()(Python 2.6+):
python复制print("Value: {:.2f}, Count: {}".format(3.14159, 5))
- f-string(Python 3.6+):
python复制value = 3.14159
print(f"Value: {value:.2f}, Count: {5}")
性能测试表明,f-string不仅是语法最简洁的方式,也是执行效率最高的方案。在Python 3.8+中,f-string还增加了=操作符用于调试:
python复制print(f"{value=:.2f}") # 输出:v
