3

下面的两个案例描述了我的困境。我想了解代码何时更稳定。

案例A

from sys import argv

a = float( argv[1] )
b = float( argv[2] )

if a == 0.:
    exit(1)
else:          
    print b / a

exit( 0 )

案例B

from sys import argv

a = float( argv[1] )
b = float( argv[2] )

if a == 0.:
    exit(1)

print b / a

exit( 0 )
4

4 回答 4

4

两种方法都提供相同的稳定性,因为从本质上讲,它们做同样的事情。

但是,第一个else不必要地使用。如果代码到达该exit(1)行,它会立即退出脚本。意思是,else没有任何积极的贡献(例如流量控制)。事实上,它所做的只是占用一行并导致不必要的缩进。

因此,如果您想知道选择哪种方法,我会说使用第二种方法。它更干净,使用更少的语法来完成相同的工作。


此外,由于退出脚本通常意味着发生了一些不寻常和不好的事情,因此仅使用if不带 theelse可以更清楚地表明您正在防止异常事件发生。

于 2013-10-22T13:49:20.293 回答
3

您应该尝试使您的代码更简洁,并有更好的流程:

import sys

def main():
    a, b = map(float, sys.argv[1:2])
    if a == 0:
        return 1
    print b / a

if __name__ == '__main__':
    sys.exit(main())

a这样,您将始终获得退出代码,如果equals ,退出代码将非零0

于 2013-10-22T13:54:08.690 回答
2

两个代码片段都有效且没有错误。然而,他们表达的想法略有不同。

第一个状态:根据 a 的值,做这个或那个。

第二个状态:如果 a 不合适,则中止。(否则继续。)

因此,第一个将两个版本视为算法的一部分,而第二个可以很容易地理解为“如果出现这种罕见的变体,就中止”。

这对运行时或稳定性没有影响(如您所说)。但是你应该考虑你想表达什么。下一个维护您的代码的开发人员可能会得到帮助或困惑,这取决于您表达的内容。

此外,以后对代码的修补、扩展等都会受到您编写代码的方式的影响。预见到这是一种更高层次的艺术,但当你问这样的问题时,它应该在你的脑海中。

在你的情况下,我猜第一个版本更容易引入以后的错误,因为它有两个用于第二个分支的块(the 的“then”分支if和下面的周围块执行exit(0))。这是一个小缺陷,一旦您想扩展它,就会为变体留出空间。例如,如果您想在结果下划线,您有两种选择:

if a == 0.:
  exit(1)
else:
  print b / a
  print '----'
exit(0)

if a == 0.:
  exit(1)
else:
  print b / a
print '----'
exit(0)

哪个更好?或者也许也exit(0)应该是“then”块的一部分?这就是我更喜欢第二个版本的原因。

于 2013-10-22T13:58:17.707 回答
0

在第一个声明中

print b/a

仅适用于如果 a 不等于 0.:

于 2017-09-15T20:16:52.833 回答