Python Pythonic组织/设计if语句的方法
我正在学习python,我想确保以正确的方式组织“if”语句。我经常遇到的情况如下:Python Pythonic组织/设计if语句的方法,python,design-patterns,if-statement,Python,Design Patterns,If Statement,我正在学习python,我想确保以正确的方式组织“if”语句。我经常遇到的情况如下: if x == 0: dostuff_A if y == 0: dostuff_B else: dostuff_B 正如您所看到的,我不断重复“dostuff_B”,并且必须不断地更改代码两次。我知道我可以用一个函数来代替“dostaff_B”,但我的问题是关于if设计的。我发现的另一个解决方法是执行以下操作,但随后我复制了if语句 if x =
if x == 0:
dostuff_A
if y == 0:
dostuff_B
else:
dostuff_B
正如您所看到的,我不断重复“dostuff_B”,并且必须不断地更改代码两次。我知道我可以用一个函数来代替“dostaff_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
我不知道它是否更像肾盂,但第二种样式对我来说更清晰(我同意冒号前的空间,并将其删除) 这也适用于其他语言 然而,你所举的两个例子(现在我仔细看了一下)在逻辑上并不等同;也许你的意思是:
if x == 0:
dostuff_A
if x != 0 or y == 0:
dostuff_B
我看到一些正确的答案已经发布了,但它们没有解释它们是如何得到解决方案的 简化嵌套的
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
if x != 0 or y == 0:
somestuff_B
从同一个表中可以看出,只有当x==0
和y==1
时才不调用B。
再一次,让我们将其转化为代码:
if x == 0:
somestuff_A
if x != 0 or y == 0:
somestuff_B
或:
如果将这两段代码放在一起,就会得到:
if x == 0:
somestuff_A
if not x == 0 or y == 0:
somestuff_B
考虑到最初的代码:
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
假设您的
dostuff_B
实际上是一个较大的代码块,分支之间应该相同,如果您更改dostuff_B
中的一个,您还需要更改另一个以保持一致。在这种情况下,复制代码是非常危险的,最好在if
语句中使用冗余代码
正如在评论中指出的,您的第二个示例与第一个示例不同。应该是:
if x == 0:
dostuff_A
if x != 0 or y == 0:
dostuff_B
当您编写一次性脚本时,哪种设计更具python风格并不重要——如果可以理解的话,它是好的。当您开始将其重构为更有用的功能时,您可以使用相应的功能。首先,您是正确的,您的Dou功能应该包含在两个单独的功能中。假设如此,我提议如下:
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,则执行_stuff_A()和_stuff_B()
- 如果x==0,则执行
- 在所有其他情况下,只需做一些事情
dostuff_A
或dostuff_B
。所以你可以在那里使用更复杂的条件。另一方面,如果第一个dostuff_B
与前一个dostuff_A
相关,则我将保留两个级别(这意味着第二个dostuff_B
在这里是其他内容)。如果dostuff_A
和dostuff_B
彼此完全无关,则最好将它们完全分开
if x == 0:
dostuff_A
if x != 0 or y == 0:
dostuff_B
这里最让我感到不和谐的是
前面的空格:
代码没有意义。第二个if
应该是if x!=0或y==0:
No,第二条if语句正确。根据最初的代码,他只想在X==0和Y==0.Nope的情况下做东西。当x!=0所以user4815162342是正确的。这里的问题是处理X!=0,这在原始代码块中表示destuff_B。我喜欢您的第二个示例。它解决了我上面提到的问题。我不喜欢您必须两次指定dostuff\B
。如果这是一个较长的语句,或多行,它会变得非常混乱和冗余。在这种情况下,如果x!=0或y==0可以。同意!我现在假设他想要他第一次陈述的逻辑,基于comments@plalx我也投票支持你的答案-不确定那里的礼仪<代码>非x==0在我看到它时总是让我感到困惑。国际海事组织,x!=最好是0