【问题标题】:Why is the output of my function printing out "None"?为什么我的函数输出打印出“无”?
【发布时间】:2021-08-06 18:01:12
【问题描述】:

我刚刚了解(正在学习)函数参数在 Python 中是如何工作的,我开始无缘无故地尝试它,当时:

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

print(jiskya(2, 3))

给出输出:

>>>
2
None

None 是从哪里来的?它是什么?

【问题讨论】:

标签: python function


【解决方案1】:

这是你打印出来的函数的返回值。如果没有返回语句(或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 很棒,而且可能比单纯的@987654332 更清晰@.
【解决方案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

【讨论】:

  • 如果打印参数在while循环中怎么办?如果我用“return”替换“print”,那么我只能打印一个值而不是完整的迭代。
【解决方案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() 返回的 print 函数的数据类型是 NoneType,而不是 print 函数内部的数据类型:

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

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

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

          【讨论】:

            猜你喜欢
            • 2022-11-21
            • 1970-01-01
            • 1970-01-01
            • 2015-02-23
            • 1970-01-01
            相关资源
            最近更新 更多