下面的两个案例描述了我的困境。我想了解什么时候代码更稳定。
案例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 )发布于 2013-10-22 13:49:20
这两种方法提供了相同的稳定性,因为从本质上说,它们所做的事情是一样的。
但是,第一种方法不必要地使用else。如果代码击中exit(1)行,它将立即退出脚本。这意味着,else并没有做出任何积极的贡献(比如流控制)。事实上,它所做的只是占用一行,造成不必要的缩进。
所以,如果您想知道选择哪种方法,我建议使用第二种方法。它更干净,使用更少的语法来完成相同的工作。
另外,由于退出脚本通常意味着发生了一些不寻常和糟糕的事情,因此只使用不带else的else就可以使您更清楚地知道,您是在防范异常事件。
发布于 2013-10-22 13:54:08
您应该尝试使您的代码更简洁,并有更好的流到它:
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等于0。
发布于 2013-10-22 13:58:17
这两个代码片段都是有效的,并且没有错误。然而,他们表达的想法略有不同。
第一种状态:根据a的值,执行这或那样的操作。
第二种状态是:如果a不合适,就中止。(以其他方式继续。)
因此,前者将这两个版本同等地视为算法的一部分,而第二个版本则很容易被理解为“在这种罕见的变体的情况下,只是中止”。
这对运行时或稳定性没有影响(正如您所说)。但你应该考虑你想表达什么。下一个维护您的代码的开发人员可能会被帮助或混淆,这取决于您所表达的内容。
此外,以后对代码的修补、扩展等也会受到代码编写方式的影响。预期这是一种更高的艺术形式,但当你问这样的问题时,它应该在你的脑后。
在您的例子中,我猜第一个版本更容易引入稍后的错误,因为它对于第二个分支有两个块( 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)也应该是“然后”块的一部分?这就是我喜欢第二个版本的原因。
https://stackoverflow.com/questions/19519607
复制相似问题