Python: Возврат из циклов
Работа с циклами обычно сводится к двум сценариям. В первом сценарии результат накапливается во время итераций, а работа с ним происходит уже после цикла. Такой подход называется агрегацией. Переворот строки относится к этому варианту. Во втором сценарии цикл выполняется до достижения необходимого результата и завершается досрочно. Таким образом реализуется, например, задача поиска простых чисел, которые делятся без остатка только на себя и на единицу.
Рассмотрим алгоритм проверки простоты числа. Будем делить искомое число x на все числа из диапазона от двух до x - 1 и смотреть остаток. Если в этом диапазоне не найден делитель, который делит число x без остатка, значит, перед нами простое число.
Проверка простоты числа 5: пошаговый разбор
- Берем число x = 5. Возможные делители ищем в диапазоне от 2 до x - 1, то есть от 2 до 4.
- Делим 5 на 2. Остаток равен 1, делителя не нашли, продолжаем.
- Делим 5 на 3. Остаток равен 2, делителя не нашли, продолжаем.
- Делим 5 на 4. Остаток равен 1, делителя не нашли, завершаем перебор.
Итог. В диапазоне 2…4 не нашлось ни одного числа, на которое 5 делится без остатка. Следовательно, 5 является простым числом.
В этом случае достаточно ограничить поиск делителей до половины числа. Например, 11 не делится на 2, 3, 4, 5 и на числа больше своей половины тоже делиться не будет. Значит, можно оптимизировать алгоритм и проверять деление только до x / 2:
def is_prime(number: int) -> bool:
if number < 2:
return False
divider = 2
while divider <= number / 2:
if number % divider == 0:
return False
divider += 1
return True
print(is_prime(1)) # => False
print(is_prime(2)) # => True
print(is_prime(3)) # => True
print(is_prime(4)) # => FalseЕсли быть честными до конца, то для решения задачи хватит проверки чисел до значения квадратного корня number, но в нашем случае важно сосредоточиться на понимании работы с условиями внутри цикла
while ...:
if условие:
return значение ← выход из функции (и из цикла)
...
─────────────────────────
Без return цикл продолжается до концаПредставим, что по алгоритму последовательного деления на числа до x / 2 нашлось одно, которое делит без остатка. Значит, переданный аргумент является составным числом, и дальнейшие вычисления не имеют смысла. В этом месте стоит возврат False.
Если цикл отработал целиком, и не нашлось число, которое делит без остатка, значит, число является простым.
Задание
Реализуйте функцию has_at_symbol(), которая проверяет, есть ли в email символ @.
Функция должна вернуть True, как только найдет @. Если цикл дошел до конца строки и символ не найден, функция должна вернуть False.
has_at_symbol('support@example.com') # True
has_at_symbol('wrong-email') # False
has_at_symbol('@admin') # TrueПолезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
from solution import has_at_symbol
def test_has_at_symbol():
assert has_at_symbol("support@example.com") is True
assert has_at_symbol("wrong-email") is False
assert has_at_symbol("@admin") is True
assert has_at_symbol("admin@") is TrueРешение учителя откроется через:
20:00
