Oto poprawiona wersja twojego kodu, która nadal działa, a ponadto pokazuje, jak podnieść ValueErrorpoziom tak, jak chcesz. Swoją drogą, myślę find_last(), find_last_index()lub coś podobnego byłoby bardziej opisową nazwą tej funkcji. Dodatkowym utrudnieniem jest fakt, że Python ma już metodę obiektu kontenera o nazwie, __contains__()która robi coś innego, testując członkostwo.
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'
Aktualizacja - znacznie prostszy sposób
Łał! Oto znacznie bardziej zwięzła wersja - zasadniczo jednolinijkowa - która prawdopodobnie jest również szybsza, ponieważ odwraca (przez [::-1]) ciąg przed wykonaniem wyszukiwania w przód w nim w poszukiwaniu pierwszego pasującego znaku i robi to przy użyciu szybkiej wbudowanej index()metody łańcuchowej . Odnosząc się do twojego rzeczywistego pytania, miłym małym ułatwieniem związanym z używaniem index()jest to, że już podnosi się, ValueErrorgdy podciąg znaku nie jest znaleziony, więc nic więcej nie jest wymagane, aby to się stało.
Tutaj jest wraz z szybkim testem jednostkowym:
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