使用尝试与如果在Python中

当测试变量来获得一个值时, if有理由决定try哪一个或者哪个构造要使用?

例如,有一个函数返回一个列表或者不返回一个值。 我想在处理之前检查结果。 以下哪项更可取,为什么?

result = function();
if (result):
    for r in result:
        #process items

要么

result = function();
try:
    for r in result:
        #process items
except TypeError:
    pass;

相关讨论:

在Python中检查成员存在


你经常会听到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 checking
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:n a/bnexcept ZeroDivisionError:n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:n a/bnexcept 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时,成本要高得多。

道德:

  • 使用try/except流量控制try/except ,完全可以(和“pythonic”),
  • 但是Exception实际上非常特殊时最有意义。
  • 从Python文档:

    EAFP

    比容许更容易要求宽恕。 这种常见的Python编码风格假定存在有效的键或属性,并且如果假设证明是错误的,则捕获异常。 这种干净而快速的风格的特点是存在许多tryexcept声明。 该技术与许多其他语言(例如C语言)通用的LBYL风格形成对比。


    你的函数不应该返回混合类型(即列表或空字符串)。 它应该返回一个值列表或者只是一个空列表。 那么你不需要测试任何东西,即你的代码崩溃到:

    for r in function():
        # process items
    

    如果我提供的代码乍一看并不明显,并且您必须阅读代码示例之后的解释,请忽略我的解决方案。

    我可以假设“没有返回值”意味着返回值是无? 如果是,或者如果“no value”为false,则可以执行以下操作,因为代码基本上将“无值”视为“不迭代”:

    for r in function() or ():
        # process items
    

    如果function()返回的是非真的东西,你迭代空元组,即你不运行任何迭代。 这实质上是LBYL。

    链接地址: http://www.djcxy.com/p/4917.html

    上一篇: Using try vs if in python

    下一篇: How exactly do partial registers on Haswell/Skylake perform? Writing AL seems to have a false dependency on RAX, and AH is inconsistent