当测试变量是否具有值时,是否有一个基本原理来决定使用哪个try或if结构?

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

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

or

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

相关讨论:

检查Python中的成员是否存在


当前回答

一般的经验法则是,永远不要使用try/catch或任何异常处理来控制流。即使幕后的迭代是通过引发StopIteration异常来控制的,您仍然应该更喜欢第一个代码片段而不是第二个。

其他回答

就性能而言,使用try块的代码通常 不引发异常比每次都使用if语句更快。所以,决定取决于特殊情况的概率。

你的第二个例子是坏的——代码永远不会抛出TypeError异常,因为你可以遍历字符串和列表。遍历空字符串或列表也是有效的——它将执行循环体0次。

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

for r in function():
    # process items

一般的经验法则是,永远不要使用try/catch或任何异常处理来控制流。即使幕后的迭代是通过引发StopIteration异常来控制的,您仍然应该更喜欢第一个代码片段而不是第二个。

一般来说,我得到的印象是例外应该为特殊情况保留。如果期望结果永远不为空(但可能为空,例如,如果磁盘崩溃等等),则第二种方法是有意义的。另一方面,如果一个空结果在正常条件下是完全合理的,那么使用If语句测试它更有意义。

我想到了(更常见的)场景:

# keep access counts for different files
file_counts={}
...
# got a filename somehow
if filename not in file_counts:
    file_counts[filename]=0
file_counts[filename]+=1

而不是等价的:

...
try:
    file_counts[filename]+=1
except KeyError:
    file_counts[filename]=1