为什么在我的函数输出后打印“None”?

Why is "None" printed after my function's output?

提问人:Grant 提问时间:8/14/2011 最后编辑:wjandreaGrant 更新时间:9/29/2022 访问量:80830

问:

我尝试编写以下代码:

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

print(smaller(2, 3))

我得到了这个结果:

>>>
2
None

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


另请参阅

公认的答案解释了从函数返回值而不是打印值的重要性。有关详细信息,请参阅返回语句的用途是什么?它与打印有何不同?

若要了解 None 结果本身,请参阅什么是“NoneType”对象?

如果要在函数内部打印以查看多个值,则最好改为收集这些值,以便调用代码可以打印它们。有关详细信息,请参阅如何使用“return”从循环中取回多个值?我可以把它们放在一个列表中吗?

Python 函数

评论

0赞 Georgy 12/8/2020
相关:返回函数的输出与打印函数有何不同?
0赞 Golden Lion 9/8/2021
您忘记在函数中返回一个值,因此 intrepretor 不返回任何值
0赞 Karl Knechtel 8/12/2022
@Georgy 我已经将该链接的规范编辑到问题中。我最近一直在做一些清理 Python 问题的规范的工作。

答:

0赞 Jared Ng 8/14/2011 #1

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

对于解释者来说,这是对所发生情况的简化:

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
65赞 phihag 8/14/2011 #2

它是函数的返回值,您可以打印出来。如果没有 return 语句(或只是没有参数的返回),则会在函数的末尾添加一个隐式语句。return None

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

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

print(jiskya(2, 3))

评论

1赞 Micha Wiedenmann 6/1/2018
有没有指定“添加隐式”的地方?return None
4赞 phihag 6/1/2018
@MichaWiedenmann我在 Python 参考中找不到任何这样的语句,但这里是注释(和代码)在 cpython 中添加返回 None
0赞 PatrickT 5/7/2020
如果我想明确,我可以用 ?return None
1赞 phihag 5/7/2020
@PatrickT 在问题的例子中,这没有意义,但是是的,如果你想让你的函数返回,那就太好了,而且可能比只是一个裸露的 .Nonereturn Nonereturn
0赞 ShadowRanger 7/9/2022
@phihag:我在参考文献中没有找到,但是关于定义函数的官方教程说:“该语句返回函数的值。 没有表达式参数返回 。从函数的末尾掉下来也会返回 。returnreturnNoneNone
1赞 Alexis Métaireau 8/14/2011 #3

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

你应该做这样的事情:

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

然后

>>> print yourfunction(2, 3)
2
5赞 Karl Knechtel 8/14/2011 #4

“无”从何而来?

函数。

它是什么?

这是函数返回的内容。

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

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

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

1赞 de1337ed 8/14/2011 #5

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

18赞 Dair 8/14/2011 #6

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

print(jiskya(2, 3))

你得到的东西几乎等于这个:

print(print(2))

那么,这是怎么回事呢?打印出 2,并返回由外部调用打印的 2。足够简单。print(2)None

现在看看这个:

def hello():
    return 2

如果这样做:

print(hello())

你得到 2,因为如果你打印出一个函数,你会得到任何值。(该值由 表示。returnreturnreturn someVariable

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

正如其他人所说:

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

应该重写:

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

评论

0赞 yihan 2/26/2018
如果 print 参数处于 while 循环中怎么办?如果我将“print”替换为“return”,那么我只能打印一个值,而不是完整的迭代。
0赞 Avinash 9/24/2020 #7

请看以下示例:

不带 return 语句的函数

Print() 函数类型为 none 类型。.

def test1():

    print("code...!!!")

type(test1())

Output: code...!!!
        NoneType

带有 return 语句的函数

返回包含 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