3

我正在学习 python,我想确保我以正确的方式组织“if”语句。我经常遇到的情况如下:

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

如您所见,我不断重复“dostuff_B”,并且必须不断地更改代码两次。我知道我可以有一个函数来代替“dostuff_B”,但我的问题是关于 if 设计。我发现的另一个解决方法是执行以下操作,但随后我复制了 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
4

7 回答 7

5

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

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

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

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

if x == 0:
    somestuff_A

从同一张表中,您可以看到唯一不调用 B 的时间是 whenx == 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
于 2013-04-23T19:51:35.133 回答
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
于 2013-04-23T19:47:15.783 回答
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
于 2013-04-23T19:57:50.833 回答
1

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

正如评论中指出的那样,您的第二个示例与第一个示例不同。它应该是:

if x == 0:
    dostuff_A
if x != 0 or y == 0:
    dostuff_B
于 2013-04-23T20:00:13.607 回答
1

Regardless of your example, which can be easily rewritten to the code below, I’d say it depends on the situation which makes more sense. In any way, I would try to avoid having to specify dostuff_A or dostuff_B more than once. So you are allowed to use more complicated conditions there. On the other hand I would keep the two-level if, if the first dostuff_B would be related to the previous dostuff_A (implying that the second dostuff_B would be something else here). If dostuff_A and dostuff_B are completely unrelated to each other, separating them completely would be preferable.

if x == 0:
    dostuff_A

if x != 0 or y == 0:
    dostuff_B
于 2013-04-23T20:05:31.240 回答
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()
于 2013-04-23T20:02:16.403 回答
0

当您编写一次性脚本时,哪种设计更符合 Pythonic 并不重要——如果可以理解,那就太好了。当您开始将其重构为更有用的东西时,您可以使用相应的重构

于 2013-04-23T20:01:04.127 回答