你经常听到Python鼓励EAFP风格(“请求宽恕比允许容易”)LBYL风格(“跳跃前看”)。对我来说,这是一个效率和可读性的问题。
在您的示例中(例如,函数不是返回一个列表或空字符串,而是返回一个列表或None),如果你期望99%的时间result将包含一些可迭代的内容,我将使用try/except接近。如果例外真的是例外的话,它会更快。如果result是None超过50%的时间,然后使用if可能更好。
为了通过一些测量来支持这一点:>>> import timeit>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking0.06379691968322732>>> timeit.timeit(setup="a=1;b=1",
stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")0.0829463709378615>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisi
onError:\n pass")0.5070195056614466>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")0.11940114974277094>>> timeit.timeit(setup=
"a=1;b=0", stmt="if b!=0:\n a/b")0.051202772912802175
所以,鉴于if陈述总花你的钱,几乎可以免费设置一个try/except封锁。但当Exception实际发生时,成本要高得多。
道德:它完全可以使用(和“丙酮”)
try/except为了流量控制,
但最有意义的是
ExceptionS实际上是很特别的。
来自Python文档:EAFP
请求宽恕比请求许可容易。这种常见的Python编码方式假定存在有效的键或属性,如果假设为false,则捕获异常。这种干净而快速的风格的特点是有许多人在场。try和except陈述。这种技术与LBYL许多其他语言(如C.