Đây là phiên bản sửa đổi của mã của bạn vẫn hoạt động cộng với nó minh họa cách nâng cao một ValueError
cách bạn muốn. By-the-way, tôi nghĩ find_last()
, find_last_index()
hoặc một cái gì đó simlar sẽ là một tên mô tả hơn cho chức năng này. Thêm vào sự nhầm lẫn có thể xảy ra là thực tế Python đã có một phương thức đối tượng vùng chứa được đặt tên __contains__()
để thực hiện điều gì đó hơi khác một chút, kiểm tra tư cách thành viên.
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'
Cập nhật - Một cách đơn giản hơn đáng kể
Chà! Đây là một phiên bản ngắn gọn hơn nhiều — về cơ bản là một lớp lót — cũng có khả năng nhanh hơn vì nó đảo ngược (qua [::-1]
) chuỗi trước khi thực hiện tìm kiếm chuyển tiếp qua nó cho ký tự khớp đầu tiên và nó làm như vậy bằng cách sử dụng index()
phương thức chuỗi tích hợp nhanh . Đối với câu hỏi thực tế của bạn, một phần thưởng tiện lợi nhỏ đi kèm với việc sử dụng index()
là nó đã tăng ValueError
khi không tìm thấy chuỗi ký tự con, vì vậy không cần bổ sung gì để điều đó xảy ra.
Đây là nó cùng với một bài kiểm tra nhanh đơn vị:
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