Hier ist eine überarbeitete Version Ihres Codes, die immer noch funktioniert. Außerdem wird veranschaulicht, wie Sie einen Code nach Ihren Wünschen erstellen können ValueError. By-the-Art und Weise, denke ich find_last(), find_last_index()oder würde etwas simlar ein beschreibender Name für diese Funktion. Zu der möglichen Verwirrung trägt die Tatsache bei, dass Python bereits über eine Containerobjektmethode mit dem Namen verfügt __contains__(), die in Bezug auf Mitgliedschaftstests etwas anderes bewirkt.
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'
Update - Ein wesentlich einfacherer Weg
Beeindruckend! Hier ist eine viel prägnante versions im Wesentlichen eines Einzeiler-die auch wahrscheinlich schneller ist , weil es umkehrt (über [::-1]) die Zeichenfolge , bevor sie eine Vorwärtssuche durch sie für den tut ersten Anpassungs Charakter und es ist mit so schnellen integrierten String - index()Methode . In Bezug auf Ihre eigentliche Frage besteht ein netter kleiner Bonus, der mit der Verwendung einhergeht index(), darin, dass bereits ein ValueErrorFehler ausgelöst wird, wenn der Zeichensubstring nicht gefunden wird. Daher ist nichts Zusätzliches erforderlich, um dies zu erreichen.
Hier ist es zusammen mit einem schnellen Unit-Test:
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