Поиск может закончиться раньше обхода
Для ответа «есть ли совпадение» достаточно первого найденного символа. Return внутри цикла завершает не только цикл, но и весь текущий вызов функции. Если совпадений не оказалось, отрицательный ответ возвращается после завершения обхода.
Задание источника
Проверьте наличие символа @ в переданной строке:
def has_at_symbol(email: str) -> bool:
index = 0
while index < len(email):
if email[index] == "@":
return True
index += 1
return False
Три сценария
Для "support@example.com" функция найдёт символ внутри строки и вернёт True. Для "wrong-email" просмотрит все позиции и вернёт False. Для "@admin" завершится уже на первой итерации с True.
Пустая строка не проходит условие цикла ни разу и даёт False. Если символов @ несколько, результат не меняется: задача проверяет наличие, а не считает количество.
Где должен находиться False
Возвращать False внутри цикла после первого несовпавшего символа нельзя. Строка, начинающаяся обычной буквой и содержащая @ дальше, тогда была бы ошибочно отклонена. Отрицательный ответ обоснован только после проверки всей строки.
Не полноценная проверка адреса
Строка "@" также даст True, хотя одного символа недостаточно для адреса электронной почты. Функция не проверяет структуру локальной части, домен, доставляемость или владение адресом. Это демонстрация раннего завершения поиска.
Встроенная запись "@" in email короче для такой задачи, но в упражнении сохранён явный цикл, чтобы показать размещение двух return и условие продвижения индекса.
Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Алгоритм сохранён; предел проверки email обозначен.