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)
但现在开始变得更加丑陋.有没有更好的方法来实现这一目标?
如果你经常这么做,那么有一个记忆装饰器可能会付出代价.目前在标准库(对于较新的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)
如果你不想两次调用myFunction(bar),那么除了使用中间变量来存储结果之外别无他法.这里的人们开始为此提出复杂的缓存解决方案.在极端情况下这可能非常方便,但在此之前,让我们稍微回顾一下基础知识.您应该正确使用您想要从条件块中返回的事实.在这些情况下,您可以节省很多else
s.现在接下来基本上是你的问题的代码块,但没有点,有适当的缩进,并根据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)
归档时间: |
|
查看次数: |
2384 次 |
最近记录: |