我正在学习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
答案 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 == 0
和y == 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()
在我看来,这清楚地说明了我在阅读代码时发生的事情:
答案 5 :(得分:1)
无论您的示例如何,都可以轻松地重写为下面的代码,我会说这取决于更有意义的情况。无论如何,我会尽量避免不止一次指定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
答案 6 :(得分:0)
当你编写一次性脚本时,哪个设计更加pythonic并不重要 - 如果可以理解它是好的。当您开始将其重构为更有用的东西时,您可以使用相应的refactoring。