Berikut adalah versi revisi dari kode Anda yang masih berfungsi ditambah itu menggambarkan cara menaikkan ValueErrorseperti yang Anda inginkan. By-the-way, saya pikir find_last(), find_last_index(), atau sesuatu simlar akan menjadi nama yang lebih deskriptif untuk fungsi ini. Menambah kebingungan yang mungkin terjadi adalah fakta bahwa Python sudah memiliki metode objek kontainer bernama __contains__()yang melakukan sesuatu yang sedikit berbeda, berdasarkan pengujian keanggotaan.
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'
Perbarui - Cara yang jauh lebih sederhana
Wow! Ini adalah versi yang jauh lebih ringkas — pada dasarnya satu baris — yang juga cenderung lebih cepat karena membalik (melalui [::-1]) string sebelum melakukan penelusuran maju melaluinya untuk karakter pertama yang cocok dan melakukannya menggunakan index()metode string built-in cepat . Sehubungan dengan pertanyaan Anda yang sebenarnya, sedikit bonus kenyamanan yang datang dengan penggunaan index()adalah bahwa hal itu sudah memunculkan ValueErrorsaat substring karakter tidak ditemukan, jadi tidak ada tambahan yang diperlukan untuk mewujudkannya.
Ini dia bersama dengan unit test cepat:
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