Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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 Pythonic组织/设计if语句的方法_Python_Design Patterns_If Statement - Fatal编程技术网

Python Pythonic组织/设计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 =

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

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