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

57 投票
7 回答
81960 浏览
提问于 2025-04-16 23:33

我尝试写了这段代码:

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

print(smaller(2, 3))

我得到了这个结果:

>>>
2
None

那里的 None 是怎么来的?它是什么意思呢?


另见

被接受的答案解释了从函数中 return 一个值的重要性,而不是直接 print 出来。想了解更多,可以查看 return 语句的目的是什么?它和打印有什么不同?

要理解 None 这个结果本身,可以查看 什么是 'NoneType' 对象?

如果你在函数内部使用 print 来查看多个值,可能更好的是先 收集 这些值,这样可以让调用代码来打印它们。详情请见 我如何使用 `return` 从循环中返回多个值?可以把它们放在一个列表里吗?

7 个回答

5

‘None’是从哪里来的?

是函数的结果。

那它是什么?

它就是函数返回的东西。

在Python中,每个函数都会返回一些东西。它可以返回多个值,像用元组那样,也可以什么都不返回,用None表示,但总是得有个返回值。这是因为Python不要求你指定返回值的类型(这其实也没什么意义,因为其他地方你也不需要指定类型)。当你想打印None时,它会显示成字符串“None”。

None是一个特殊的对象,用来表示没有任何实际的东西。它的类型是NoneType(它是这个类型的一个实例)。每当你没有明确返回任何东西时,实际上就是返回了None

你写的函数是用来打印两个值中的一个xy,而不是返回任何东西。所以它返回了None。然后你让Python打印调用这个函数的结果。于是它调用了函数(打印了其中一个值),然后打印了返回值,这个返回值是None,所以显示成了文本“None”。

18

好的,首先当你这样做的时候:

print(jiskya(2, 3))

你得到的结果基本上是这个:

print(print(2))

那么,这到底发生了什么呢?print(2) 是在输出数字2,然后返回None,这个None又被外部调用打印出来。这个过程很简单明了。

现在看看这个:

def hello():
    return 2

如果你这样做:

print(hello())

你会得到2,因为如果你打印一个函数,你会得到它的return(返回)值。return值是通过return someVariable来表示的。

虽然print没有像大多数函数那样有括号,但它也是一个函数,只是在这方面有点特别。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
65

这是函数的返回值,你可以把它打印出来。如果函数里没有写返回语句(或者只是写了一个没有参数的 return),那么在函数的最后会自动加上一个 return None

你可能想在函数里返回值,而不是直接打印出来:

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

print(jiskya(2, 3))

撰写回答