Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python编写if-else的更优雅的方法_Python_Coding Style - Fatal编程技术网

用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,if
a
returns…”开头的段落旨在处理该问题。但也许应该更明确一点?我会尝试重写它;谢谢,吉兹。已经离开讲台了^^(一个很好的全面答案)。这相当于我答案中的一个选项,只是我使用了
格式
而不是串联。把它拉到一个单独的答案中确实有助于强调它的可能性,但我不确定它是否值得强调。