当前位置: 首页 > 面试题库 >

在python中使用try vs if

公冶鸣
2023-03-14
问题内容

测试变量具有值时,是否有理由确定要使用哪个tryif构造?

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

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

要么

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

问题答案:

你通常会听到Python鼓励EAFP风格(“请求宽恕比许可容易”)而不是LBYL风格(“跨越前先看”)。对我来说,这是效率和可读性的问题。

在你的示例中(例如,该函数不是返回列表或空字符串,而是返回列表或None),如果你希望99%的时间result实际上包含可迭代的内容,则可以使用该try/except方法。如果异常确实是例外,它将更快。如果resultNone的时间超过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块几乎是免费的。但是当Exception实际发生时,成本要高得多。

道德:

  • try/except用于流程控制完全可以(和“ pythonic”),
  • 但当Exceptions实际上是例外时,这才有意义。


 类似资料:
  • 问题内容: 我有一个使用100%Java编写的大型现有代码库,但是我想在它的一些新部分中使用Python。我需要进行一些文本和语言处理,而我宁愿使用Python和类似NLTK的库来执行此操作。 我知道Jython项目,但这似乎代表了一种从Python内部使用Java及其库的方法,而不是相反的方式-我对此是否错? 如果没有,那么在Java和Python之间进行交互的最佳方法是什么,这样(理想情况下)

  • 问题内容: 我正在浏览文档,并遇到了以下示例: 我不明白的是这里的lambda和学生是什么?可以用其他任何名称代替它们吗?和什么做的?这有点模棱两可,因为我以前从未遇到过。 问题答案: 从语义上说: 与此相同: 只是为函数定义提供了另一种语法。结果是一个函数对象,就像由创建的对象一样。但是,有些功能是功能无法完成的,例如定义新变量。它们非常适合(取决于您要问的人)创建较小的一次性功能,例如此功能。

  • 问题内容: 我需要使用python处理XSLT,目前我正在使用仅支持XSLT 1的lxml,现在我需要处理XSLT 2,有没有办法在Python中使用saxon XSLT处理器? 问题答案: 有两种可能的方法: 设置一个接受转换请求的HTTP服务,并通过从Java调用Saxon来实现它们;然后您可以通过HTTP通过Python发送转换请求 使用Saxon / C产品 (当前在预发行版中可用) :此

  • 问题内容: 我在玩耍时偶然发现了Python中的一个函数。我想不出需要此功能的情况,除了可能是语法糖。谁能举一个例子? 问题答案: 并且是一种方便快捷的方法,可以动态地获取一些源代码,也许要稍加修改然后再执行- 但是,它们从来不是最好的方法,尤其是在生产代码中,而不是“快速而又简单”脏”的原型&c。 例如,如果我不得不处理这样的动态Python源代码,那么我会使用ast模块-比得多(比它更安全(您

  • 问题内容: 我正在寻找可以解释如何使用而不是的基础知识。 我的问题是尝试使用一个类的方法/函数返回数据,然后将数据放入另一个方法/函数中。在这种情况下,也许更简单的方法会更好,但是我试图了解类是如何工作/使用的。这个问题似乎取决于,这是我试图对此进行相当简单的使用。 尽管问题不完全相同,但我遵循的是Python The Hard Way,ex42 —循环@第18-41行。 我尝试编写一个,并改用,

  • 我得到了我的旋转值从OPI0到我的电脑,现在我想让一个物体在我的陀螺仪面对的方向旋转(度数值从180到-180)我对Python相当陌生。glRotatef(1,xrot,yrot,zrot)只设置当前旋转的旋转。但是我实际上想要的是,如果它是180度,我想把它放到180度。这可以通过获取当前旋转来归档,测试它是否变小或变大,然后调整旋转或用命令设置旋转到度数值。所以我的主要问题是:有没有设置创建

  • 本章介绍如何使用Python编程语言对JSON对象进行编码和解码。让我们从准备环境开始,使用Python for JSON开始编程。 环境 在开始使用Python编码和解码JSON之前,需要安装任何可用的JSON模块。在本教程中,我们已经下载并安装了Demjson,如下所示 $tar xvfz demjson-1.6.tar.gz $cd demjson-1.6 $python setup.p

  • 问题内容: 使用virtualenv,我使用默认版本的Python(2.7)运行项目。在一个项目中,我需要使用Python 3.4。 我曾经将其安装在Mac上。现在,如何创建使用新版本的virtualenv? 例如sudo virtualenv envPython3 如果我尝试: 我得到: 问题答案: 只需运行 OP编辑后更新: 有没有在OP的版本virtualenv中的一个bug,如所描述这里。