Вот исправленная версия вашего кода, которая все еще работает, плюс она показывает, как поднять 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