【问题标题】:Do I have to cause an ValueError in Python我是否必须在 Python 中导致 ValueError
【发布时间】:2010-09-12 23:39:58
【问题描述】:

我有这个代码:

chars = #some list

try:
    indx = chars.index(chars)
except ValueError:
    #doSomething
else:
   #doSomethingElse

我希望能够这样做,因为我不喜欢故意导致异常:

chars = #some list

indx = chars.index(chars)

if indx == -1:
    #doSomething
else:
   #doSomethingElse

有什么办法可以做到吗?

【问题讨论】:

  • 注意:您正在搜索的列表和要查找的项目使用相同的变量名称(字符)。其中之一可能会有所不同,除非您在自引用列表中搜索它们引用自己的位置。
  • 如果你想要高效的代码,最好学会享受异常,而不是担心“故意导致异常”。异常以及引发异常是 Python 的重要组成部分。

标签: python exception list


【解决方案1】:

请注意,后一种方法与EAFP, or "It is Easier to Ask for Forgiveness than Permission." 普遍接受的“pythonic”哲学背道而驰,而前者则遵循它。

【讨论】:

  • 哪种方式更快?或者这是一个无关紧要的问题?我应该使用C吗? ;)
  • @jinguy:不用担心速度。只需编写易于阅读的代码。如果您需要更好的性能,请通过配置文件运行它——很可能缓慢的部分不是异常处理。
  • @jinguy,通常 EAFP 在非错误情况下具有优越的性能,这种情况比错误情况发生得更频繁(在大多数情况下:)。 YMMV 取决于细节。
【解决方案2】:
if element in mylist:
    index = mylist.index(element)
    # ... do something
else:
    # ... do something else

【讨论】:

  • 当然,这会在列表中搜索两次,对于长列表,速度会渐近两倍……但我不知道更好的解决方案。
【解决方案3】:

对于您的列表是单字符串序列的特定情况,您可以通过提前将要搜索的列表更改为字符串(例如,''.join(chars))来获得所需的内容。

然后您可以使用 .find() 方法,该方法可以按您的意愿工作。但是,列表或元组没有对应的方法。

另一个可能的选择是使用字典。例如。

d = dict((x, loc) for (loc,x) in enumerate(chars))
...
index = d.get(chars_to_find, -1)  # Second argument is default if not found.

如果您在列表中进行大量搜索,这也可能会表现得更好。但是,如果只是在一次性列表上进行一次搜索,那不值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2019-11-29
    • 2021-10-18
    • 2016-03-16
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多