为什么Python返回'NoneType'?

2 投票
3 回答
13340 浏览
提问于 2025-04-16 10:07

我有一段代码,主要是用来解决Project Euler中的一个问题,目的是找出前20个自然数的最小公倍数(LCM)。

def GCD(a, b):              #Euclid's algorithim
    if (b == 0):
        return a
    else:
        GCD(b, a % b)

def LCM(a, b):             #LCM(a,b) = a*b/GCD(a,b)
    x = GCD(a, b)
    return ((a * b)/x)

def RFIND(a, b):
    if (b == 20):
        return a
    else:
        RFIND(LCM(a, b), b + 1)

print RFIND(2, 1)

但是在运行的时候,我遇到了一个错误。

    return ((a * b)/x)
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType'

请问这是为什么呢?

3 个回答

2

它不是返回的 NoneType,而是返回了 None。这个除法操作表示它不知道怎么把 intNoneType 这两种类型进行除法,因为你尝试去除的就是这两种类型。你可以试试下面这个例子:

>>> 'g'/6
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'int'

你会看到,它并不是说不能把 'g' 和 6 除,而是说它不能把 'str' 和 'int' 除。所以:

>>> 1/None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType'

而且这里其他人已经指出,返回 None 是因为你忘记写 return 语句了。

3

你的递归实现得不对。

def GCD(a, b):              #Euclid's algorithim
 ...
        return GCD(b, a % b)

def RFIND(a, b):
 ...
        return RFIND(LCM(a, b), b + 1)
14

试试看

def GCD(a, b):              #Euclid's algorithim
    if (b == 0):
        return a
    else:
        return GCD(b, a % b)

你需要把递归调用返回的值返回。RFIND 也有类似的问题。

撰写回答