有条件地返回函数的最Pythonic的方法是什么

2024-01-10

假设我有 2 个函数。我希望 func2 返回 func1 除非 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 两次,也不必创建新变量?如果这is唯一的方法,您会推荐这两种方法中的哪一种?我目前使用第二种方式(我将 foo 设置为 func1 返回的内容,而不是返回 foo 除非 foo == None)

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


Since None评估为False,你可以这样做:

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

但需要注意的是,这会导致func2回来something_else if func1(n)返回任何错误的内容(0, [], etc.)


对于许多功能,您可以使用next https://docs.python.org/3/library/functions.html#next还有一些生成器表达式 https://docs.python.org/3/reference/expressions.html#grammar-token-generator_expression:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有条件地返回函数的最Pythonic的方法是什么 的相关文章

随机推荐