Ось переглянута версія вашого коду, яка все ще працює, плюс вона пояснює, як підняти 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