如何引发ValueError?

use*_*225 105 python string

我有这个代码,它找到字符串中特定字符的最大索引,但是我希望它ValueError在字符串中没有出现指定字符时引发.

所以像这样:

contains('bababa', 'k')
Run Code Online (Sandbox Code Playgroud)

会导致:

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]
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 165

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

  • 您是否知道,如果您不想使用该消息,可以只使用“ raise ValueError”而不是“ raise ValueError()”? (2认同)

mar*_*eau 26

这是您的代码的修订版本仍然有效,并说明了如何提高ValueError您想要的方式.顺便说一句,我认为find_last(),find_last_index()或类似的东西将是这个功能的更具描述性的名称.

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'))  # ->
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)

更新 - 一种更简单的方法

哇!这是一个更简洁的版本 - 本质上是一个单行 - 也可能更快,因为它__contains__()在对第一个匹配字符进行前向搜索之前反转(通过)字符串,并且它使用快速内置字符串[::-1]方法这样做.关于你的实际问题,使用时带来的一个很好的小额外奖励index()就是它index()在找不到字符子字符串时已经提出了一个,所以不需要额外的东西来实现这一点.

这是一个快速的单元测试:

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'))  # ->
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

  • @John Machin:不要认为我可以对我没有看到也看不到的已删除答案评论中的要求不履行要求负责。但是,即使我的第二个函数不使用 `for` 循环,它*确实* 以某种方式回答了有关在字符串中找不到字符时如何`提高``ValueError` 的实际问题——即通过调用其他为你做的事情。还有一种前景是 OP 可能会在看到 sans-`for` 解决方案或以后对 Python 更加熟悉后,克服他们的 `for`-fixation 或任何其他问题。 (2认同)

Joh*_*hin 12

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)


小智 7

在最新版本的python中,您可以使用fstrings

让我们 value = "Hello"

raise ValidationError(f"{value} is not valid category")
Run Code Online (Sandbox Code Playgroud)