Цикл 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 → завершить всю функцию