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 ValueError
Fehler 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