Python中函数与辅助函数的调用输出规则是否存在差异?

你的观察结论是对的,但你对原因的理解完全错了——这个差异和「主函数/辅助函数」的身份没有任何关系,核心是两个函数的内部逻辑差异,加上Python的运行规则共同导致的。
首先先明确两个最基础的规则:
- 如果你是把代码写在
.py文件里直接运行:只有显式调用print()、或者代码里自带往控制台写内容的逻辑,才会在终端看到输出。单独写一个值、一个表达式、一次函数调用,只要没主动打印,返回值会被直接丢弃,不会显示。 - 如果你是在Python交互式命令行(REPL,就是终端输入
python弹出的带>>>提示符的环境)里运行:单独占一行、没有被赋值给变量的表达式,如果返回值不是None,REPL会自动把这个返回值打印出来;赋值语句不会触发自动打印。
再回到你遇到的现象,本质原因非常简单:
你定义的g(x)内部本身就写了print语句,自带输出副作用。
不管你用哪种方式调用g(x)——直接写g(x)、写z = g(x)赋值、还是写print(g(x))——Python做的第一件事都是先完整执行g(x)内部的所有代码,只要函数跑起来,它内部的print就会直接往控制台输出内容,这部分输出和你外部有没有赋值、有没有套print没有任何关系。
而你定义的辅助函数h()内部没有写任何输出逻辑,只是把计算结果通过return返回,本身不会主动往控制台写内容:
- 直接执行
h():脚本环境下返回值直接被丢弃,没有输出;如果是在REPL环境下没看到输出,要么是你实际在脚本环境运行,要么是h()实际返回值为None - 执行
z = h()赋值:返回值被存到变量z里,没有任何打印动作,自然没有输出 - 执行
print(h()):先调用h()拿到返回值,再通过外层的print把返回值主动打印到控制台,你才能看到结果
不存在“函数有特殊特性、主函数才支持多调用形式输出”的规则。你可以做个简单验证:给h()内部加一行和g(x)一样的print语句,再调用就会发现h()和之前g(x)的表现完全一致;反过来把g(x)内部的print删掉,g(x)就会和之前h()的表现一致,只有套print的时候才会输出结果。
补充一个你可以马上验证的细节:如果g(x)内部有print同时有返回值,你执行print(g(x))的时候会看到两行输出——第一行是g(x)内部print打出来的内容,第二行是外层print把g(x)的返回值打出来的内容。
内容的提问来源于stack exchange,提问作者Adil Mohammed
相关产品推荐
相关产品推荐

