问题:如何引发ValueError?
我有这段代码可以找到字符串中特定字符的最大索引,但是ValueError
当字符串中未出现指定字符时,我希望它提高a值。
所以像这样:
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]
回答 0
raise ValueError('could not find %c in %s' % (ch,str))
回答 1
这是您的代码的修订版本,该版本仍然有效,并且还说明了如何提高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
回答 2
>>> 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
>>>
回答 3
>>> response='bababa'
... if "K" in response.text:
... raise ValueError("Not found")