用python编写if-else的更优雅的方法
例如,如果我有代码:用python编写if-else的更优雅的方法,python,coding-style,Python,Coding Style,例如,如果我有代码: class Example (): def a(self): return 'Buy' def b(self): if (self.a() == 'Buy'): return 'BUY SET' elif (self.a() == 'Sell'): return 'SELL SET'' o = Example() value = o.b() print
class Example ():
def a(self):
return 'Buy'
def b(self):
if (self.a() == 'Buy'):
return 'BUY SET'
elif (self.a() == 'Sell'):
return 'SELL SET''
o = Example()
value = o.b()
print value
有没有一种更优雅/更通俗的方法来编写函数b(self)?你可以使用字典:
def b(self):
return {'Buy': "BUY SET", 'Sell': "SELL SET"}.get(self.a())
或者写得更清楚一些:
def b(self):
d = {"Buy": "BUY SET",
"Sell": "SELL SET"}
return d.get(self.a())
首先,去掉不必要的括号;它们只会使代码的结构更难遵循:
def b(self):
if self.a() == 'Buy':
return 'BUY SET'
elif self.a() == 'Sell':
return 'SELL SET''
然后移除导致其引发语法错误的杂散”
:
def b(self):
if self.a() == 'Buy':
return 'BUY SET'
elif self.a() == 'Sell':
return 'SELL SET'
接下来,不要调用self.a()两次。虽然它在这里是无害的,但在实际代码中,它很有可能会产生副作用,或者至少需要足够长的时间,以至于浪费时间:
def b(self):
order = self.a()
if order == 'Buy':
return 'BUY SET'
elif order == 'Sell':
return 'SELL SET'
接下来,如果a
返回的不是'Buy'
或'Sell'
,那么您将返回None
。这真的是你想要的吗?如何解决这一问题取决于您实际需要什么。例如,您可能需要:
def b(self):
order = self.a()
if order == 'Buy':
return 'BUY SET'
elif order == 'Sell':
return 'SELL SET'
else:
raise ValueError("Unexpected order type '{}'".format(order))
或者可能:
def b(self):
order = self.a()
if order == 'Buy':
return 'BUY SET'
else: # We know there's nothing else it could be
return 'SELL SET'
如果您有两种以上的可能性,那么将内容放入dict
中,而不是使用If
/elif
链或编写动态代码可能是值得的。示例:
def b(self):
return {'Buy': 'BUY SET', 'Sell': 'SELL SET', 'Trade': 'TRADE SET',
'Barter': 'BARTER SET', 'Steal': 'STEAL SET'}[self.a()]
def b(self):
return '{} SET'.format(order.upper())
请注意,对于上一个问题,这些选项会做出不同的选择。对于未知值,dict
版本将引发KeyError
;格式
版本只会将任何内容视为有效
此外,如果您使用dict
,您可能希望将其移到b
函数之外,例如,使其成为类属性(这也鼓励您为其命名)
然而,只有两个选择,我认为你有更清楚
最后,给函数起一个没有意义的单字母名称并不是很符合python;最好是这样做:
def get_formatted_order(self):
order = self.calculate_order()
if order == 'Buy':
return 'BUY SET'
elif order == 'Sell':
return 'SELL SET''
为什么不直接缓存它呢
def b(self):
a = self.a()
if a == 'Buy':
return 'BUY SET'
elif a == 'Sell':
return 'SELL SET''
我也会给你的变量起一个清晰的名字<代码>a和
b
根本不是描述性的。虽然abarnet的答案肯定是最具说服力的,但对于给定的代码,这同样有效:
def b(self):
return self.a().upper() + " SET"
但是这使得很多假设都不是很普遍。在所有很酷的建议之后,你可以尝试更多的技巧来缩短你的代码
def get_formatted_order(self):
order = self.calculate_order()
return 'BUY SET' if order == 'Buy' else 'SELL SET'
这是三元运算符的python形式。如果订单计算为“购买”,函数将返回“购买集”。在相反的情况下,它将返回“SELL SET”删除不需要的参数,并在进行比较之前存储
result=self.a()
。有一个else子句可能也很有用。我想,作为一个开始,“更优雅/通灵”的做法是使用有意义的名称。@Marcin这就是为什么我使用get
-默认值为None
这很短,看起来还不错,但你不需要启动一个字典。@ajon这到底有什么问题?没有迹象表明OP会遇到时间和空间开销小的问题,他只是要求更优雅的代码。我同意@pst,但这仍然是一个很好的演示,说明了如果你有,20种不同的选择,而不是2种。我总是使用字典来处理这样的事情——它使以后添加项目变得非常容易,并且使在其他上下文中允许使用该映射变得更加容易。但是如果a
只能返回'Buy'
或'Sell'
,那么您最好使用if else
子句,而不是if elif
子句。@Volatility:以“Next,ifa
returns…”开头的段落旨在处理该问题。但也许应该更明确一点?我会尝试重写它;谢谢,吉兹。已经离开讲台了^^(一个很好的全面答案)。这相当于我答案中的一个选项,只是我使用了格式
而不是串联。把它拉到一个单独的答案中确实有助于强调它的可能性,但我不确定它是否值得强调。