什么是有条件地返回函数的最pythonic方式

时间:2014-07-15 18:59:14

标签: python function return conditional-statements

说我有2个功能。我希望func2返回func1 UNLESS func1返回None,在这种情况下func2返回其他内容。我有两种方法可以做到这一点,但他们都觉得有些不对劲。

我可以说:

def func1(n):
    if (condition):
        return foo

def func2(n):
    if func1(n) is not None:
        return func1(n)
    else:
        return something_else

但这感觉不对,因为我必须调用func1(n)两次(并且func1(n)是一个更大的计算)。为了解决这个问题,我可以说:

def func1(n):
    if (condition):
        return foo

def func2(n):
    foo = func1(n)
    if foo is not None:
        return foo
    else:
        return something_else

但这感觉不对,因为我不认为我应该分配一个永远不会再次使用的新变量,只是检查func1是否返回None。

有没有更简单的方法来执行此操作,我不必再调用func1两次而且我不必创建新变量?如果这个唯一的方法,你会推荐哪两个?我目前使用第二种方式(我将foo设置为func1返回的位置,而不是返回foo,除非foo ==无)

另外,请记住,在我的实际代码中,我调用了几个不同的函数,我想返回第一个不是None的函数,这只是一个更简单的代码版本,可以解决问题。

4 个答案:

答案 0 :(得分:8)

由于None评估为False,您可以执行以下操作:

def func2(n):
    return func1(n) or something_else

但应注意,如果func2返回任何虚假的内容(something_elsefunc1(n)等),这将导致0返回[]。< / p>


对于许多功能,您可以使用next和一些generator expressions

def myfunc(n):
    vals = (f(n) for f in (func1, func2, func3...))
    return next((v for v in vals if v is not None), something_else)

答案 1 :(得分:6)

给调用func1的结果命名是相对便宜的,所以我会这样做,但写下这样的函数:

def func2(n):
    ret = func1(n)
    return ret if ret is not None else something_else

答案 2 :(得分:1)

你绝对不想两次打电话给func1 - 而且效率低下,func1可能会产生副作用或根据当时的状态产生稍微不同的答案。< / p>

此外,else之后return不需要return退出该功能。

第二个选项的修订版将是:

def func1(n):
    if condition:
        return foo

def func2(n):
    foo = func1(n)
    if foo is None:
        return something_else
    return foo

请注意,即使&#39; func1&#39;返回一个假值。

或者,注意func1的内容,您可以这样做:

def func1(n):
    return foo

def func2(n):
    foo = func1(n)
    if condition:
        return foo
    return something_else

这取决于func1的实际内容是什么。

答案 3 :(得分:1)

根据您对iCodez的评论,与我之前的回答完全不同:

def func1(n):
    return ham

def func2(n):
    return jam

def func3(n):
    return spam

def mainfunc(n):
    for f in (func1, func2, func3):
        foo = f(n)
        if foo is not None:
            return foo