นี่คือเวอร์ชันแก้ไขของโค้ดของคุณซึ่งยังใช้งานได้และยังแสดงให้เห็นถึงวิธีการเพิ่มValueError
ในแบบที่คุณต้องการ by-the-วิธีที่ผมคิดว่าfind_last()
, find_last_index()
หรือสิ่ง simlar จะเป็นชื่อที่สื่อความหมายมากขึ้นสำหรับฟังก์ชั่นนี้ การเพิ่มความสับสนที่อาจเกิดขึ้นคือความจริงที่ว่า Python มีเมธอดคอนเทนเนอร์ที่ตั้งชื่อ__contains__()
ซึ่งทำสิ่งที่แตกต่างออกไปเล็กน้อยและชาญฉลาดในการทดสอบการเป็นสมาชิก
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'
อัปเดต - วิธีที่ง่ายกว่ามาก
ว้าว! ต่อไปนี้เป็นเวอร์ชันที่กระชับกว่ามากโดยพื้นฐานแล้วเป็นซับเดียวซึ่งน่าจะเร็วกว่าด้วยเพราะจะย้อนกลับ (ผ่าน[::-1]
) สตริงก่อนที่จะทำการค้นหาไปข้างหน้าเพื่อหาอักขระที่ตรงกันตัวแรกและจะใช้สตริงในตัวที่รวดเร็วindex()
วิธี . สำหรับคำถามที่แท้จริงของคุณความสะดวกสบายโบนัสเล็กน้อยที่มาพร้อมกับการใช้งานindex()
คือValueError
เมื่อไม่พบสตริงย่อยของอักขระแล้วจึงไม่จำเป็นต้องมีอะไรเพิ่มเติมเพื่อให้สิ่งนั้นเกิดขึ้น
นี่คือพร้อมกับการทดสอบหน่วยอย่างรวดเร็ว:
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