İşte kodunuzun hala çalışan revize edilmiş bir sürümü ve ayrıca ValueErroristediğiniz şekilde nasıl yükseltileceğini gösteriyor . Bu arada, sanırım find_last(), find_last_index()ya da benzeri bir şey bu işlev için daha açıklayıcı bir isim olurdu. Muhtemel karışıklığa ek olarak, Python'un __contains__()üyelik testi açısından biraz farklı bir şey yapan bir kapsayıcı nesne yöntemine zaten sahip olması gerçeğidir .
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'
Güncelleme - Çok daha basit bir yol
Vaov! İşte çok daha özlü bir versiyon - esasen tek satırlık - bu aynı zamanda muhtemelen daha hızlıdır çünkü ilk eşleşen karakter [::-1]için ileri arama yapmadan önce dizeyi ters çevirir (üzerinden ) ve bunu hızlı yerleşik dize yöntemini kullanarak yapar. . Asıl sorunuzla ilgili olarak, kullanımla birlikte gelen hoş bir küçük bonus kolaylık , karakter alt dizesi bulunmadığında zaten a'yı yükseltmesidir , bu nedenle bunun olması için ek bir şey gerekmez.index()index()ValueError
İşte hızlı bir birim testi ile birlikte:
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