【问题标题】:Why is Python returning None instead of value [duplicate]为什么Python返回None而不是值[重复]
【发布时间】:2019-05-08 21:19:34
【问题描述】:

这些愚蠢的问题中的另一个。 我这里有一个非常简单的算法来计算最大的 commen 除数。

我的 C++ sn-p 是这样的

int findGcd(int m, int n)
{
    int r = m % n;

    if(r == 0)
    {
        return n;
    }

    else
    {
        m = n;
        n = r;
        findGcd(m, n);
    }
}

int main()
{
    cout << findGcd(13, 3);

    return 0;
}

... 它返回(与本例中的预期完全一样)1.

如果我在 Python 中实现它 - 如下所示:

def findGcd(m, n):
"""Calculates the greatest common divider """
    r = m % n

    if r == 0:
        return n

    else:
        m = n
        n = r
        findGcd(m, n)




number = findGcd(13,3)
print(number)

它只返回 NONE 而不是 1。我已经对其进行了调试,并且 n 确实存储了正确的 1 值,但仍然返回 None。

我可以通过在 else 分支中对函数的递归调用添加“return”来解决此问题。 但这是为什么呢?

【问题讨论】:

  • 我无法在 C++ 中重现您的输出
  • @juanpa.arrivillaga,这是因为在 C++ 中,缺少的 return 会导致未定义的行为。
  • 我使用的是在线 C++ 编译器。原来是s#*t。很抱歉在这个问题上浪费了您的时间。误解只是由编译器的意外行为引起的。不过感谢您的帮助!
  • 注意,种语言有返回语句隐式返回,例如斯卡拉。但是,你不应该假设因为某些东西在 C++(或者在这种情况下,它没有)或 Scala 中可以在 Python 中工作。

标签: python c++ algorithm math


【解决方案1】:

在这两种情况下,您都需要在递归调用中使用return

否则,在 C++ 中,您将有未定义的行为。在 Python 中,你会得到None

C++

int findGcd(int m, int n)
{
    int r = m % n;

    if(r == 0)
    {
        return n;
    }

    else
    {
        m = n;
        n = r;
        return findGcd(m, n);
    }
}

Python:

def findGcd(m, n):
"""Calculates the greatest common divider """
    r = m % n

    if r == 0:
        return n

    else:
        m = n
        n = r
        return findGcd(m, n)

您可以通过提高编译器的警告级别来发现 C++ 中的此类问题。使用g++ -Wall,我得到:

socc.cc: In function ‘int findGcd(int, int)’:
socc.cc:16:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

【讨论】:

    猜你喜欢
    • 2018-06-25
    • 2020-10-17
    • 2011-10-19
    • 2023-01-30
    • 2015-07-03
    • 2013-07-15
    • 2013-05-30
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多