【问题标题】:Why is "None" printed after my function's output?为什么在我的函数输出后打印“无”?
【发布时间】:2022-11-21 17:20:47
【问题描述】:

我试着写这段代码:

def smaller(x, y):
    if x > y:
        print(y) 
    else:
        print(x) 

print(smaller(2, 3))

我得到了这个结果:

>>>
2
None

None 是从哪里来的?这是什么意思?


也可以看看

接受的答案解释了returning 函数值的重要性,而不是printing 它。有关详细信息,请参阅What is the purpose of the return statement? How is it different from printing?

要了解 None 结果本身,请参阅 What is a 'NoneType' object?

如果您在函数内部 printing 以查看多个值,最好改为搜集这些值,以便它们可以被调用代码打印出来。详情见How can I use `return` to get back multiple values from a loop? Can I put them in a list?

【问题讨论】:

标签: python function


【解决方案1】:

它是您打印出来的函数的返回值。如果没有 return 语句(或 just a return without an argument),则隐式 return None 将添加到函数的末尾。

您可能希望返回函数中的值而不是打印它们:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x

print(jiskya(2, 3))

【讨论】:

  • 是否有指定的地方“添加了隐式return None”?
  • @MichaWiedenmann 我在the Python reference 中找不到任何相关声明,但在here is the comment (and code) adding the return None in cpython 中找不到。
  • 如果我想明确一点,我可以用 return None 结束函数吗?
  • @PatrickT 在这个毫无意义的问题示例中,但是是的,如果您希望您的函数返回None,那么return None 就很棒,而且可能比一个简单的return 更清晰。
  • @phihag:我在参考资料中没有找到,但是the official tutorial on defining functions 说:“return 语句从函数返回一个值。return 没有表达式参数返回None。从结尾掉下来一个函数也返回None。”
【解决方案2】:

好的,当你这样做时开始:

print(jiskya(2, 3))

你得到的东西几乎等同于此:

print(print(2))

那么发生了什么? print(2) 打印出 2,并返回由外部调用打印的 None。够直截了当。

现在看看这个:

def hello():
    return 2

如果你这样做:

print(hello())

你得到 2 是因为如果你打印出一个函数,你会得到 return 值是什么。 (return 值由 return someVariable 表示。

现在,尽管 print 不像大多数函数那样有括号,但在这方面它是一个有点特殊的函数。打印返回什么?没有什么。所以当你print print someVariable时,你会得到None作为第二部分,因为print的返回值是None

所以正如其他人所说:

def jiskya(x, y):
    if x > y:
        print(y)
    else:
        print(x)

应该重写:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x

【讨论】:

  • 如果 print 参数在 while 循环中怎么办?如果我用“返回”替换“打印”,那么我只能打印一个值而不是完整的迭代。
【解决方案3】:

“无”从何而来?

功能。

还有,这是什么?

这就是函数返回的内容。

在 Python 中,每个函数都会返回一些东西。它可以使用元组“是多个东西”,也可以使用None“什么都不是”,但它必须返回一些东西。这就是我们处理无法指定返回类型这一事实的方式(这没有任何意义,因为您没有为其他任何内容指定类型)。当解释为用于打印的字符串时,None 将替换为字符串“None”。

None 是一个特殊的对象,应该代表没有任何真实的东西。它的类型是NoneType(它是那个类的一个实例)。每当您不显式返回任何内容时,您都会隐式返回 None。

您编写了函数来打印 xy 两个值之一,但不返回任何内容。所以None被退回了。然后你要求 Python 打印调用该函数的结果。所以它调用函数(打印其中一个值),然后打印返回值,即None,作为文本“None”。

【讨论】:

    【解决方案4】:

    您正在执行两次打印,第一个打印在您函数的语料库中,第二个打印函数的结果,实际上是 None。

    你应该做这样的事情:

    def yourfunction(x, y):
        if x > y:
            return y
        else:
            return x
    

    然后,

    >>> print yourfunction(2, 3)
    2
    

    【讨论】:

      【解决方案5】:

      是的,基本上您在函数中使用 print 语句作为返回信息的方式。你不应该这样做。打印与返回语句不同。如果您只是想让您的函数在没有 none 的情况下给出答案,只需键入 jiskya(2, 3) 即可。您将看到函数抛出的内容,因为函数中有打印语句。相反,如果您在函数中键入“return”,那么如果函数调用之前没有“print”,它就不会给您任何信息。

      【讨论】:

        【解决方案6】:

        问题是你写了print jiskya(2,3)。您将 jiskya 的返回值传递给 print 函数。 jiskya 本身打印xy,这就是您看到 2 的原因。但是随后 print jiskya(2, 3) 语句中的 print 本身执行时没有参数。

        对于口译员来说,这是对发生的事情的简化:

        print jiskya(2,3)
        >> Executing jiskya with arguments 2, 3
        >> jiskya evaulates `print x`
        >> 2 is printed
        >> Function jiskya exits with no return value
        print None
        >> None is printed
        

        【讨论】:

          【解决方案7】:

          考虑以下示例:

          没有返回语句的函数

          Print() 函数类型是无类型..

          def test1():
          
              print("code...!!!")
          
          type(test1())
          
          Output: code...!!!
                  NoneType
          

          带返回语句的函数

          返回保存 print() 函数的变量 'a',这就是为什么 type() 返回打印函数的数据类型是 NoneType,而不是打印函数内部的数据类型:

          def test1():
          
              a= print("code...!!!")
              
              return a
          
          type(test1())
          
          
          Output: code...!!!
                  NoneType
          

          这里函数返回变量“a”的数据类型,其中包含一个字符串。

          def test1():
          
              a = "First code...!!!"
              
              return a
          
          type(test1())
          
          
          Output: str
          
          

          【讨论】:

            猜你喜欢
            • 2021-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-02
            相关资源
            最近更新 更多