Цикл while в функциях Python: практические задачи

Обновлено:

Цикл while часто используется внутри функций.

В таком случае функция:

  • получает необходимые данные через параметры;
  • выполняет повторяющиеся действия в цикле;
  • возвращает готовый результат через return.

Рассмотрим несколько практических примеров.


1. Сумма цифр числа

Напишем функцию, которая получает целое число и возвращает сумму его цифр.

def get_digit_sum(number):
    number = abs(number)

    total = 0

    while number > 0:
        digit = number % 10

        total += digit

        number //= 10

    return total

Проверим:

print(
    get_digit_sum(5837)
)

Результат:

23

Потому что:

5 + 8 + 3 + 7 = 23

Как работает функция

В цикле каждый раз получаем последнюю цифру:

digit = number % 10

Добавляем её к общей сумме:

total += digit

После этого удаляем последнюю цифру:

number //= 10

Получается:

5837
↓
583
↓
58
↓
5
↓
0

Когда число становится равным 0, цикл заканчивается.


2. Количество цифр

Напишем функцию, которая определяет количество цифр целого числа.

def get_digit_count(number):
    number = abs(number)

    if number == 0:
        return 1

    count = 0

    while number > 0:
        number //= 10

        count += 1

    return count

Проверим:

print(
    get_digit_count(5837)
)

Результат:

4

Для:

print(
    get_digit_count(-250)
)

получим:

3

Знак минуса цифрой не является.

Отдельно обрабатываем:

0

потому что в числе 0 одна цифра, хотя условие:

while number > 0:

для него сразу было бы ложным.


3. Разворот целого числа

С помощью тех же операций можно собрать цифры в обратном порядке.

def reverse_number(number):
    reversed_number = 0

    while number > 0:
        digit = number % 10

        reversed_number = (
            reversed_number * 10
            + digit
        )

        number //= 10

    return reversed_number

Проверим:

print(
    reverse_number(5837)
)

Результат:

7385

Как собирается новое число

Первая цифра:

7
0 * 10 + 7

Получаем:

7

Следующая цифра:

3
7 * 10 + 3

Получаем:

73

Дальше:

73 * 10 + 8 = 738
738 * 10 + 5 = 7385

Итог:

5837 → 7385

4. Поиск элемента списка

Напишем собственную функцию, которая ищет элемент в списке и возвращает его индекс.

def find_index(values, target):
    index = 0
    values_length = len(values)

    while index < values_length:
        if values[index] == target:
            return index

        index += 1

    return -1

Проверим:

technologies = [
    'Python',
    'SQL',
    'Django',
    'FastAPI',
]

print(
    find_index(
        technologies,
        'Django',
    )
)

Результат:

2

Если элемента нет

print(
    find_index(
        technologies,
        'Java',
    )
)

Результат:

-1

Как только функция находит нужное значение:

if values[index] == target:

выполняется:

return index

return не только возвращает результат, но и сразу полностью завершает функцию.

Поэтому остальные элементы после найденного значения уже проверяться не будут.


5. Получение степеней двойки

Напишем функцию, которая создаёт список степеней двойки до указанного максимального значения.

def get_powers_of_two(limit):
    number = 1
    numbers = []

    while number <= limit:
        numbers.append(number)

        number *= 2

    return numbers

Например:

result = get_powers_of_two(
    100,
)

print(result)

Результат:

[1, 2, 4, 8, 16, 32, 64]

Следующим значением было бы:

128

Но:

128 <= 100

даёт:

False

поэтому цикл заканчивается.


6. Получение целого числа от пользователя

while особенно полезен в функциях, которые должны повторять действие до получения подходящих данных.

Например, функция может запрашивать целое число:

def get_integer(message):
    while True:
        user_input = input(
            message
        ).strip()

        normalized_input = (
            user_input
            .removeprefix('-')
        )

        if normalized_input.isdecimal():
            return int(user_input)

        print(
            'Необходимо ввести целое число'
        )

Используем:

age = get_integer(
    'Введите возраст: '
)

print(age)
print(type(age))

Если пользователь сначала введёт:

Введите возраст: Python

функция сообщит:

Необходимо ввести целое число

и снова запросит значение.

Например:

Введите возраст: 25

После этого выполняется:

return int(user_input)

и функция заканчивается.


Здесь не нужен break

Можно было бы написать:

while True:
    ...

и отдельно использовать:

break

Но если найденное значение нужно сразу вернуть из функции, удобно использовать:

return

Потому что return завершает не только цикл, а всю функцию.


break и return внутри функции

Важно различать:

break

и:

return

break:

завершает цикл
↓
функция продолжает работать после цикла

return:

сразу завершает всю функцию
↓
и при необходимости возвращает результат

Например:

def find_index(values, target):
    index = 0

    while index < len(values):
        if values[index] == target:
            return index

        index += 1

    return -1

Здесь после нахождения элемента продолжать цикл уже нет никакого смысла.

Поэтому return хорошо подходит для досрочного завершения поиска.


Главное по теме

Цикл while часто находится внутри функции:

def function(...):
    while condition:
        ...

    return result

Он особенно удобен, когда:

  • заранее неизвестно точное количество повторений;
  • нужно изменять значение до выполнения определённого условия;
  • нужно обрабатывать цифры числа;
  • нужно искать данные;
  • нужно повторять пользовательский ввод;
  • каждый следующий результат зависит от предыдущего.

Например:

def get_digit_sum(number):
    ...

считает сумму цифр.

def get_digit_count(number):
    ...

определяет количество цифр.

def reverse_number(number):
    ...

разворачивает число.

def find_index(values, target):
    ...

ищет элемент последовательным обходом.

def get_powers_of_two(limit):
    ...

строит последовательность значений.

def get_integer(message):
    ...

повторяет запрос до получения подходящего пользовательского ввода.

При работе с while внутри функций особенно полезно помнить разницу:

break  → завершить только цикл
return → завершить всю функцию