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
