为啥我的函数输出打印出“无”?
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。
您编写的函数打印x
或y
两个值之一,但不返回任何内容。所以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
本身会打印 x
或 y
,这就是为什么您会看到 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 控制台中打印出格式化输出?