Функция my_substr()
, которую вы реализовали в прошлом уроке, содержит много ошибок. Она прошла проверку, так как в ней не было пограничных случаев. Функция работала с нормальными аргументами. А теперь представим, что ей передали такие варианты длины:
0
Функция my_substr()
не рассчитана на такие варианты. Код будет запускаться в разных ситуациях, с разными комбинациями условий и данных. Нельзя быть уверенным, что аргументы всегда будут корректными, поэтому нужно учитывать все случаи.
Ошибки в пограничных случаях — частая причина логических ошибок в программах. Программисты всегда забывают что-нибудь учесть. Такие ошибки часто проявляются не сразу и могут долго не приводить к видимым проблемам.
Программа продолжает работать, но в какой-то момент обнаруживается, что в результатах есть ошибки. Часто причина в динамической типизации Python.
Вы научитесь справляться с такими ошибками с опытом.
Представим расширенную функцию my_substr()
. Она принимает три аргумента: строку, индекс и длину извлекаемой подстроки. Функция возвращает подстроку указанной длины, начиная с указанного индекса. Примеры вызова:
string = 'If I look back I am lost'
print(my_substr(string, 0, 1)) # => 'I'
print(my_substr(string, 3, 6)) # => 'I look'
Какие пограничные случаи стоит учитывать:
Когда функция реализуется, каждый пограничный случай будет отдельным куском кода. Скорее всего, он будет реализовываться с помощью if
.
Чтобы написать функцию my_substr()
и защититься от этих случаев, стоит реализовать отдельную функцию, которая будет проверять аргументы на корректность.
Реализуйте функцию-предикат is_arguments_for_substr_correct()
, которая принимает три аргумента:
Функция возвращает False
, если хотя бы одно из условий истинно:
В ином случае функция возвращает True
.
Не забывайте, что индексы начинаются с 0
, поэтому индекс последнего элемента — это «длина строки минус 1».
Пример вызова:
string = 'Sansa Stark'
print(is_arguments_for_substr_correct(string, 2, -3)) # => False
print(is_arguments_for_substr_correct(string, -1, 3)) # => False
print(is_arguments_for_substr_correct(string, 4, 100)) # => False
print(is_arguments_for_substr_correct(string, 10, 10)) # => False
print(is_arguments_for_substr_correct(string, 11, 1)) # => False
print(is_arguments_for_substr_correct(string, 3, 3)) # => True
print(is_arguments_for_substr_correct(string, 0, 5)) # => True
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import index
2
3
4def test1():
5 string = 'Sansa Stark'
6 end = len(string) - 1
7 assert not index.is_arguments_for_substr_correct(string, -1, 0)
8 assert not index.is_arguments_for_substr_correct(string, 0, -1)
9 assert not index.is_arguments_for_substr_correct(string, end + 1, 0)
10 assert not index.is_arguments_for_substr_correct(string, end, 5)
11 assert index.is_arguments_for_substr_correct(string, end, 1)
12 assert index.is_arguments_for_substr_correct(string, 3, 3)
13 assert index.is_arguments_for_substr_correct(string, 0, 3)
14 assert index.is_arguments_for_substr_correct(string, 0, 1)
15 assert index.is_arguments_for_substr_correct(string, 0, 0)
16
Решение учителя откроется через: