你通常会听到Python鼓励EAFP风格(“请求宽恕比许可容易”)而不是LBYL风格(“跨越前先看”)。对我来说,这是效率和可读性的问题。
在你的示例中(例如,该函数不是返回列表或空字符串,而是返回列表或None),如果你希望99%的时间@H_301_3@result实际上包含可迭代的内容,则可以使用该@H_301_3@try/except方法。如果异常确实是例外,它将更快。如果@H_301_3@result是@H_301_3@None的时间超过@H_301_3@50%,则使用if的可能会更好。
为了通过一些测量来支持这一点:
@H_301_3@>>> import timeit >>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking 0.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 ZeroDivisionError:\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实际发生时,成本要高得多。
道德: