为啥我的函数输出打印出“无”?

Posted

技术标签:

【中文标题】为啥我的函数输出打印出“无”?【英文标题】: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 是从哪里来的?它是什么?

【问题讨论】:

相关:How is returning the output of a function different from printing it? 你忘了在你的函数中返回一个值,所以解释器没有返回任何值 【参考方案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

【讨论】:

以上是关于为啥我的函数输出打印出“无”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 ArrayList 没有打印出 Java 所需的输出?

为啥 awesome_print 不在我的 Rails 4.2 控制台中打印出格式化输出?

STREAMLIT:如何打印函数的输出

为啥我的链表内容在退出函数时会消失?

Python中的标准库函数print()输出(打印出)字符串的常见用法

为啥我的 Graphql 项目抛出错误:字段类型必须是输出类型但得到:未定义