【问题标题】:Should a function print a string or return it?函数应该打印一个字符串还是返回它?
【发布时间】:2012-06-20 20:11:56
【问题描述】:

我正在编写一个 Python 脚本,它需要向控制台打印一行。很简单,但我不记得(或决定)接受的做法是否是在函数中打印,例如:

def exclaim(a):
    print (a + '!')

或者让它返回一个字符串,比如:

def exclaim(a):
    return (a + '!')

然后在主脚本中打印。我可以为任何一种方法提出论据。是否有一种普遍接受的方式来做到这一点,还是取决于偏好?


编辑:澄清一下,这不是我正在使用的功能。我不喜欢在这里发布代码,所以我把这些函数写成一个过于简单的例子。

【问题讨论】:

  • 我不认为你应该返回一个字符串只是为了在不同的函数中打印它
  • 我很确定这只是您的偏好,尽管从函数内部打印对我来说似乎更有意义(在该示例中)。但是,我可以看到以另一种方式可能更有意义的情况 - 例如,如果您有时想使用该功能,但并不总是希望它打印一些东西。

标签: python styles conventions


【解决方案1】:

通常,函数应该生成并返回其输出,并让调用者决定如何处理它。

如果您直接在函数中打印结果,那么很难重用该函数来做其他事情,并且很难测试,因为您必须拦截 stdout 而不仅仅是测试返回值。

但是在这个简单的示例中,似乎几乎没有必要重用或测试该功能,甚至根本不需要该功能。

【讨论】:

  • 这个例子只是一个例子。我不允许分享代码,所以我决定写一些东西来传达我的概念。感谢您的帮助!
【解决方案2】:

我最欣赏 Python 的一件事是它鼓励适当的关注点分离。将任务分解为原子组件几乎没有摩擦。

计算值和显示值是两个不同的东西,它们不应该混在一起。

【讨论】:

  • 这就是我所倾向于的,但是将我的脚本变成一个“打印”列表也感觉有点不对劲。感谢您的建议!
【解决方案3】:

要记住的一件事是,如果您打印它,您的函数将不会返回任何内容,所以如果您打算使用您希望编写的行,您应该返回它。

【讨论】:

    【解决方案4】:

    如果您确定该函数不能被重用,并且您形成该函数只是为了增强代码的可读性,您可以在函数中打印它。

    否则,如果您以后可以通过任何方式重新使用它,则应该返回该值。第二种方法是首选,因为函数的目的之一是重用。

    没有真正的开销。

    【讨论】:

      【解决方案5】:

      在我看来,函数应该返回值。

      【讨论】:

        【解决方案6】:

        我一直将这两种方式混合在一起,但我认为它可以归结为这样:

        • 如果整个函数的唯一目的是输出到终端(向用户打印一条消息),那么该函数应该打印。或者,您可以使用一些返回值作为错误状态或布尔值,但作为辅助步骤。通常打印出来的字符串/消息在程序流程中不会有其他用途,因为用户收到了消息,并且字符串变量已经被消费了,可以被垃圾回收。

        • 1234563在另一份声明中。在调试的情况下,您只需删除或注释该打印语句,但该函数将继续静默执行。只是为了比较,如果 print 语句在函数内部,则需要修改函数本身。

        最后考虑一下,这两种方法在某种程度上是等效的,但是对于阅读您的代码的任何人(甚至是您自己),从可读性的角度来看,它的布局方式有助于捕捉代码的意图。

        希望对你有帮助

        【讨论】:

          【解决方案7】:

          如果一个函数计算值然后立即打印它们,我经常会发现我最终会希望在不同的地方或以不同的方式显示或使用这些值。

          我将决定将结果写入文件,将它们作为网页的一部分发送出去,将它们用作其他函数的部分值,以不同的方式显示它们的排序或过滤,等等。

          在您进行原型设计时,或者如果函数非常简单时,可以让函数立即打印计算值……但迟早,如果程序变得更大、更有价值,您将需要转换那个简单的“打印出来!”函数转换为更纯粹的计算和返回函数。

          所以我尝试从返回结果、稍后打印的编码风格开始。它看起来更干净,通常可以节省我以后的时间。但就像所有风格的东西一样,这是一个判断电话,还有 YMMV。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-22
            • 2014-05-07
            • 1970-01-01
            • 2020-08-12
            • 1970-01-01
            • 2017-03-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多