Python Pythonic组织/设计if语句的方法

时间:2013-04-23 19:44:20

标签: python design-patterns if-statement

我正在学习python,我想确保以正确的方式组织“if”语句。我一直在努力的情况如下:

if x == 0:
    dostuff_A
    if y == 0:
        dostuff_B            
else:
    dostuff_B

正如你所看到的,我不断重复“dostuff_B”并且不得不两次更改代码。我知道我可以有一个函数而不是“dostuff_B”但我的问题是关于if design。我找到的另一个解决方法是执行以下操作,但后来我复制了if语句。

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B

有什么想法吗?提前谢谢!

更新:删除冒号前的空格。还更新了我的解决方法,因为没有意义。原始版本是:

if x == 0:
    dostuff_A
if x == 0 and y == 0:
    dostuff_B

7 个答案:

答案 0 :(得分:4)

我不知道它是否更加pythonic,但第二种风格更清楚地告诉我(我同意结肠前的空间,并删除它)。

if x == 0:
    dostuff_A
if x == 0 and y == 0:
    dostuff_B

这也可以支持其他语言。

然而,你所拥有的两个例子(现在我更接近它)在逻辑上并不相同;也许你的意思是:

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B

答案 1 :(得分:4)

我看到已经发布了一些正确的答案,但他们没有解释他们如何解决问题。

简化嵌套if-else语句的一种方法是使用真值表:

x    y    what you call
-----------------------
0    0    A and B
0    1    A
1    0    B
1    1    B

从上表中可以看出,您只在x == 0时调用了A.我们把它放到代码中:

if x == 0:
    somestuff_A

在同一张桌子中,您可以看到,您唯一一次不致电B的时间是x == 0y == 1。 再说一遍,我们把它放到代码中:

if x != 0 or y == 0:
    somestuff_B

或:

if not x == 0 or y == 0:
    somestuff_B

如果你将两段代码放在一起,这就是你得到的:

if x == 0:
    somestuff_A
if not x == 0 or y == 0:
    somestuff_B

答案 2 :(得分:4)

考虑这个初始代码:

if x == 0 :
    dostuff_A
    if y == 0 :
        dostuff_B            
else :
    dostuff_B

可以重写为:

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B

答案 3 :(得分:1)

据推测,您的dostuff_B实际上是一个更大的代码块,在分支之间应该是相同的,如果您更改dostuff_B之一,则还需要更改另一个以保持一致。在这种情况下,复制代码存在非常大的危险,而你最好在if语句中做多余。

正如评论中所指出的,你的第二个例子与第一个例子不同。它应该是:

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B

答案 4 :(得分:1)

首先,你是对的,你的do_stuff应该是两个独立的函数。假设,我提出以下建议:

if x == 0 and y == 0:
   do_stuff_A()
   do_stuff_B()
elif x == 0:
   do_stuff_A()
else:
    do_stuff_B()

在我看来,这清楚地说明了我在阅读代码时发生的事情:

  • 如果x和y == 0,那么do_stuff_A()和do_stuff_B()
  • 如果x == 0,则do_stuff_A()
  • 在所有其他情况下,只需do_stuff_B()

答案 5 :(得分:1)

无论您的示例如何,都可以轻松地重写为下面的代码,我会说这取决于更有意义的情况。无论如何,我会尽量避免不止一次指定dostuff_Adostuff_B。所以你可以在那里使用更复杂的条件。另一方面,如果第一个dostuff_B与之前的dostuff_A相关,则我会保留两个级别(意味着第二个dostuff_B将是其他内容)。如果dostuff_Adostuff_B彼此完全无关,则最好将它们分开。

if x == 0:
    dostuff_A

if x != 0 or y == 0:
    dostuff_B

答案 6 :(得分:0)

当你编写一次性脚本时,哪个设计更加pythonic并不重要 - 如果可以理解它是好的。当您开始将其重构为更有用的东西时,您可以使用相应的refactoring