如何引发值错误?

2024-04-26 14:12:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这段代码,它可以找到字符串中特定字符的最大索引,但是当指定字符不在字符串中时,我希望它引发一个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]

Tags: 函数字符串代码instringdefnotfind
3条回答

raise ValueError('could not find %c in %s' % (ch,str))

下面是您的代码的修订版,它仍然有效,并且说明了如何按照您所希望的方式提高ValueError。顺便说一下,我认为find_last()find_last_index()或者simlar之类的东西会是这个函数更具描述性的名称。更令人困惑的是,Python已经有了一个名为^{}的容器对象方法,它在成员测试方面做了一些不同的事情。

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
>>> 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
>>>

相关问题 更多 >