Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用try-vs-if_Python - Fatal编程技术网

在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或任何异常处理来控制流。即使在幕后