Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Python
/

Возврат из циклов

Python: Возврат из циклов

Работа с циклами обычно сводится к двум сценариям. В первом сценарии результат накапливается во время итераций, а работа с ним происходит уже после цикла. Такой подход называется агрегацией. Переворот строки относится к этому варианту. Во втором сценарии цикл выполняется до достижения необходимого результата и завершается досрочно. Таким образом реализуется, например, задача поиска простых чисел, которые делятся без остатка только на себя и на единицу.

Рассмотрим алгоритм проверки простоты числа. Будем делить искомое число x на все числа из диапазона от двух до x - 1 и смотреть остаток. Если в этом диапазоне не найден делитель, который делит число x без остатка, значит, перед нами простое число.

Проверка простоты числа 5: пошаговый разбор

  1. Берем число x = 5. Возможные делители ищем в диапазоне от 2 до x - 1, то есть от 2 до 4.
  2. Делим 5 на 2. Остаток равен 1, делителя не нашли, продолжаем.
  3. Делим 5 на 3. Остаток равен 2, делителя не нашли, продолжаем.
  4. Делим 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
Коммерческий опыт и Трудоустройство

Полезное

  • Список простых чисел

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс Python
/

Возврат из циклов

Python: Возврат из циклов

Работа с циклами обычно сводится к двум сценариям. В первом сценарии результат накапливается во время итераций, а работа с ним происходит уже после цикла. Такой подход называется агрегацией. Переворот строки относится к этому варианту. Во втором сценарии цикл выполняется до достижения необходимого результата и завершается досрочно. Таким образом реализуется, например, задача поиска простых чисел, которые делятся без остатка только на себя и на единицу.

Рассмотрим алгоритм проверки простоты числа. Будем делить искомое число x на все числа из диапазона от двух до x - 1 и смотреть остаток. Если в этом диапазоне не найден делитель, который делит число x без остатка, значит, перед нами простое число.

Проверка простоты числа 5: пошаговый разбор

  1. Берем число x = 5. Возможные делители ищем в диапазоне от 2 до x - 1, то есть от 2 до 4.
  2. Делим 5 на 2. Остаток равен 1, делителя не нашли, продолжаем.
  3. Делим 5 на 3. Остаток равен 2, делителя не нашли, продолжаем.
  4. Делим 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

waiting_clock
← ПредыдущийСледующий →