使用尝试与如果在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编码风格假定存在有效的键或属性,并且如果假设证明是错误的,则捕获异常。 这种干净而快速的风格的特点是存在许多try
和except
声明。 该技术与许多其他语言(例如C语言)通用的LBYL风格形成对比。
你的函数不应该返回混合类型(即列表或空字符串)。 它应该返回一个值列表或者只是一个空列表。 那么你不需要测试任何东西,即你的代码崩溃到:
for r in function():
# process items
如果我提供的代码乍一看并不明显,并且您必须阅读代码示例之后的解释,请忽略我的解决方案。
我可以假设“没有返回值”意味着返回值是无? 如果是,或者如果“no value”为false,则可以执行以下操作,因为代码基本上将“无值”视为“不迭代”:
for r in function() or ():
# process items
如果function()
返回的是非真的东西,你迭代空元组,即你不运行任何迭代。 这实质上是LBYL。