在python中使用try-vs-if
当测试变量是否有值时,是否有理由决定使用在python中使用try-vs-if,python,Python,当测试变量是否有值时,是否有理由决定使用try或if结构中的哪一个 例如,有一个函数返回列表或不返回值。我想在处理之前检查一下结果。以下哪项更可取?为什么 result = function(); if (result): for r in result: #process items 或 相关讨论: 您的第二个示例被破坏了-代码永远不会抛出TypeError异常,因为您可以遍历字符串和列表。遍历空字符串或列表也是有效的-它将执行循环体零次。您的第二个示例被破坏了-代码
try
或if
结构中的哪一个
例如,有一个函数返回列表或不返回值。我想在处理之前检查一下结果。以下哪项更可取?为什么
result = function();
if (result):
for r in result:
#process items
或
相关讨论:
您的第二个示例被破坏了-代码永远不会抛出TypeError异常,因为您可以遍历字符串和列表。遍历空字符串或列表也是有效的-它将执行循环体零次。您的第二个示例被破坏了-代码永远不会抛出TypeError异常,因为您可以遍历字符串和列表。遍历空字符串或列表也是有效的-它将执行循环体零次。一般来说,我得到的印象是,异常应该为异常情况保留。如果
结果
预计永远不会为空(但可能为空,例如,如果磁盘崩溃等),则第二种方法是有意义的。另一方面,如果一个空的结果
在正常情况下是完全合理的,那么使用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
一般来说,我得到的印象是,例外情况应该保留给例外情况。如果
结果
预计永远不会为空(但可能为空,例如,如果磁盘崩溃等),则第二种方法是有意义的。另一方面,如果一个空的结果
在正常情况下是完全合理的,那么使用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
你经常听说Python鼓励风格(“请求原谅比允许更容易”)而不是风格(“三思而后行”)。对我来说,这是一个效率和可读性的问题 在您的示例中(假设函数不是返回一个列表或空字符串,而是返回一个列表或
None
),如果您期望99%的时间结果
实际上包含一些可编辑的内容,我会使用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/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
块几乎是免费的。但是当一个异常实际发生时,成本要高得多
道德:
- 使用
try/except
进行流量控制完全可以(而且“pythonic”)
- 但是当
Exception
s实际上是异常的时候,它最有意义李>
从Python文档中:
EAFP
请求原谅比请求更容易
许可。这是常见的Python编码
样式假定存在有效的
键、属性和捕捉
假设成立时的例外情况
错。这种干净利落的风格很流行
以许多人在场为特点
尝试
和语句除外。这个
技术与技术形成对比
许多其他语言所共有的风格
比如C
你经常听说Python鼓励风格(“请求原谅比允许更容易”)而不是风格(“三思而后行”)。对我来说,这是一个效率和可读性的问题
在您的示例中(假设函数不是返回一个列表或空字符串,而是返回一个列表或None
),如果您期望99%的时间结果
实际上包含一些可编辑的内容,我会使用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/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
块几乎是免费的。但是当一个异常实际发生时,成本要高得多
道德:
- 使用
try/except
进行流量控制完全可以(而且“pythonic”)
- 但是当
Exception
s实际上是异常的时候,它最有意义李>
从Python文档中:
EAFP
请求原谅比请求更容易
许可。这是常见的Python编码
样式假定存在有效的
键、属性和捕捉
假设成立时的例外情况
错。这种干净利落的风格很流行
以许多人在场为特点
尝试
和语句除外。这个
技术与技术形成对比
许多其他语言所共有的风格
比如C
函数不应返回混合类型(即列表或空字符串)。它应该返回一个值列表,或者只是一个空列表。这样,您就不需要进行任何测试,即您的代码折叠为:
for r in function():
# process items
函数不应返回混合类型(即列表或空字符串)。它应该返回一个值列表,或者只是一个空列表。这样,您就不需要进行任何测试,即您的代码折叠为:
for r in function():
# process items
一般来说,您不应该使用try/catch或任何异常处理来控制流。即使幕后迭代是通过引发StopIteration
异常来控制的,但您仍然应该更喜欢第一个代码片段而不是第二个。一般经验法则是,您不应该使用try/catch或任何异常处理来控制流。即使在幕后