Python赋值和使用elif的函数测试

rwo*_*lst 14 python if-statement variable-assignment

我见过类似的问题,但不完全一样.我有一个表达

if foo == ....
  return -1
elif myFunction(bar) != -1:
  return myFunction(bar)
elif ...
Run Code Online (Sandbox Code Playgroud)

我不想计算myFunction(bar)两次.如果它只是一个if,我可以做到

temp = myFunction(bar)
if temp != -1
  return temp
Run Code Online (Sandbox Code Playgroud)

然而elif,temp如果我们要遵循初始条件,那么使用a 会导致不必要的计算if.

我可以看到使用的解决方案

if ...
else
  temp = myFunction(bar)
  if temp != -1:
    return temp
  elif ...
Run Code Online (Sandbox Code Playgroud)

但现在开始变得更加丑陋.有没有更好的方法来实现这一目标?

Fre*_*Foo 7

如果你经常这么做,那么有一个记忆装饰器可能会付出代价.目前在标准库(对于较新的Python 3.x)中唯一的memoizer是lru_cache,这是过度的,但显示了一般的想法:

>>> def func():
...     print("foo")
...     return 1
... 
>>> if func():
...     print(func())
...     
foo
foo
1
Run Code Online (Sandbox Code Playgroud)

现在回忆一下func:

>>> from functools import lru_cache
>>> func = lru_cache(1)(func)
>>> if func():
...    print(func())
...     
foo
1
Run Code Online (Sandbox Code Playgroud)


Jan*_*cke 7

如果你不想两次调用myFunction(bar),那么除了使用中间变量来存储结果之外别无他法.这里的人们开始为此提出复杂的缓存解决方案.在极端情况下这可能非常方便,但在此之前,让我们稍微回顾一下基础知识.您应该正确使用您想要从条件块中返回的事实.在这些情况下,您可以节省很多elses.现在接下来基本上是你的问题的代码块,但没有点,有适当的缩进,并根据PEP8的名称:

if foo == "bar"
    return -1
elif myfunction(bar) != -1:
    return myfunction(bar)
else
    return None
Run Code Online (Sandbox Code Playgroud)

它可以很容易地替换为:

if foo == "bar"
    return -1
t = myfunction(bar)
if t != -1:
    return t
return None
Run Code Online (Sandbox Code Playgroud)

正如另一个答案中所述,如果它不影响代码的性能,您可以调用您的函数两次.结果看起来很简单

if foo == "bar"
    return -1
if myfunction(bar) != -1:
    return myfunction(bar)
return None
Run Code Online (Sandbox Code Playgroud)