如何引发ValueError?

123 投票
4 回答
245615 浏览
提问于 2025-04-16 08:15

我有一段代码,它可以找到一个特定字符在字符串中出现的最大索引。不过,我希望当这个字符在字符串中没有出现时,它能抛出一个 ValueError 错误。

比如说,像这样:

contains('bababa', 'k')

就会得到一个:

ValueError: could not find k in bababa

我该怎么做呢?

这是我当前的函数代码:

def contains(string,char):
  list = []

  for i in range(0,len(string)):
      if string[i] == char:
           list = list + [i]

  return list[-1]

4 个回答

11

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如,当用户点击一个按钮时,我们希望程序能做出反应。这种情况就需要用到“事件处理”。

事件处理就是当某个事件发生时,程序能够自动执行预先设定好的代码。比如说,当你点击一个按钮,程序就会执行你写好的代码,可能是打开一个新页面,或者显示一条消息。

为了实现事件处理,我们通常需要给某个元素(比如按钮)添加一个“监听器”。这个监听器就像一个守卫,时刻关注着这个元素的状态,一旦检测到用户的操作,比如点击,就会触发相应的代码。

简单来说,事件处理就像是给程序加上了耳朵和眼睛,让它能听到和看到用户的操作,然后做出反应。

>>> def contains(string, char):
...     for i in xrange(len(string) - 1, -1, -1):
...         if string[i] == char:
...             return i
...     raise ValueError("could not find %r in %r" % (char, string))
...
>>> contains('bababa', 'k')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in contains
ValueError: could not find 'k' in 'bababa'
>>> contains('bababa', 'a')
5
>>> contains('bababa', 'b')
4
>>> contains('xbababa', 'x')
0
>>>
29

这是你代码的一个改进版本,它依然可以正常工作,并且展示了如何按照你想要的方式抛出一个 ValueError。顺便说一下,我觉得 find_last()find_last_index() 或者类似的名字会更好地描述这个函数。可能会让人困惑的是,Python 已经有一个叫做 __contains__() 的方法,它在检查成员资格时做的事情有点不同。

def contains(char_string, char):
    largest_index = -1
    for i, ch in enumerate(char_string):
        if ch == char:
            largest_index = i
    if largest_index > -1:  # any found?
        return largest_index  # return index of last one
    else:
        raise ValueError('could not find {!r} in {!r}'.format(char, char_string))

print(contains('mississippi', 's'))  # -> 6
print(contains('bababa', 'k'))  # ->
Traceback (most recent call last):
  File "how-to-raise-a-valueerror.py", line 15, in <module>
    print(contains('bababa', 'k'))
  File "how-to-raise-a-valueerror.py", line 12, in contains
    raise ValueError('could not find {} in {}'.format(char, char_string))
ValueError: could not find 'k' in 'bababa'

更新 — 一种简单得多的方法

哇!这里有一个更简洁的版本——基本上就是一行代码——而且可能更快,因为它先把字符串反转(通过 [::-1]),然后再从前往后查找第一个匹配的字符,并且使用了快速的内置字符串 index() 方法。关于你实际的问题,使用 index() 的一个小好处是,当找不到字符子串时,它会自动抛出一个 ValueError,所以不需要额外的代码来实现这一点。

下面是代码和一个快速的单元测试:

def contains(char_string, char):
    #  Ending - 1 adjusts returned index to account for searching in reverse.
    return len(char_string) - char_string[::-1].index(char) - 1

print(contains('mississippi', 's'))  # -> 6
print(contains('bababa', 'k'))  # ->
Traceback (most recent call last):
  File "better-way-to-raise-a-valueerror.py", line 9, in <module>
    print(contains('bababa', 'k'))
  File "better-way-to-raise-a-valueerror", line 6, in contains
    return len(char_string) - char_string[::-1].index(char) - 1
ValueError: substring not found
190

这行代码的意思是:如果找不到某个字符(用变量ch表示)在一个字符串(用变量str表示)里,就会抛出一个错误,错误的类型是ValueError。错误信息会告诉你具体是哪个字符没有找到,以及它是在哪个字符串里找的。

撰写回答