What is the most pythonic way to conditionally return a function
说我有2个功能。我希望func2返回func1 UNLESS func1返回None,在这种情况下func2返回其他内容。我有两种方法可以做到这一点,但他们都觉得有点不对劲。
我可以说:
1 2 3 4 5 6 7 8 9 | 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)是一个更大的计算)。为了解决这个问题,我可以说:
1 2 3 4 5 6 7 8 9 10 | 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)
另外,请记住,在我的实际代码中,我调用了几个不同的函数,我想返回第一个不是None的函数,这只是一个更简单的代码版本,可以解决问题。
由于
1 2 | def func2(n): return func1(n) or something_else |
但应注意,如果
对于许多函数,您可以使用
1 2 3 | 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) |
给调用func1的结果命名是相对便宜的,所以我会这样做,但是写这样的函数:
1 2 3 | def func2(n): ret = func1(n) return ret if ret is not None else something_else |
根据您对iCodez的评论,与我之前的回答完全不同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
你肯定不想两次调用
此外,在
您的第二个选项的修订版将是:
1 2 3 4 5 6 7 8 9 | def func1(n): if condition: return foo def func2(n): foo = func1(n) if foo is None: return something_else return foo |
请注意,即使'func1'返回falsey值,这仍然有效。
或者,注意
1 2 3 4 5 6 7 8 | def func1(n): return foo def func2(n): foo = func1(n) if condition: return foo return something_else |
这取决于