Урок 5. Цикл while и обработка цифр числа в Python



Словарь Python-объектов

Ниже приведён справочник по основным конструкциям, операторам и шаблонам, рассмотренным в этом уроке. Каждый пункт содержит ссылку на соответствующий раздел теории, лабораторную работу или задание.

Как пользоваться: щёлкните по названию объекта — откроется соответствующий раздел теории, где этот объект подробно разобран с примерами.

Цикл while loop

  • while условие:
    Повторяет блок кода, пока условие истинно.
  • Тело цикла
    Блок команд с отступом, выполняемый на каждой итерации.
  • Цикл с предусловием
    Условие проверяется до выполнения тела.
  • for vs while
    for — когда известно число повторений; while — когда неизвестно.

Управление циклом control

Обработка цифр digits

  • n % 10
    Получить последнюю (младшую) цифру числа.
  • n // 10
    Удалить последнюю цифру числа.
  • while n != 0
    Стандартный цикл перебора всех цифр числа.
  • reversed = reversed * 10 + digit
    Сборка перевёрнутого числа.
  • len(str(n))
    Количество разрядов числа.
  • num // 10**(n-i) % 10
    Получить i-ю цифру слева (через for).

Типовые шаблоны patterns

Ввод и вывод I/O

  • input()
    Считывает строку от пользователя. Возвращает str.
  • int(input())
    Считывает целое число с клавиатуры.
  • print()
    Выводит данные на экран.

Лабораторные работы practice

Самостоятельные задания tasks



Теория

1. Введение. Зачем нужен цикл while

В предыдущем уроке мы рассмотрели цикл for — счётный цикл. Он отлично работает, когда мы заранее знаем, сколько повторений (итераций) нам потребуется.

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

  • считывать числа до тех пор, пока пользователь не введёт stop;
  • делить число на 10, пока оно не станет равным нулю;
  • запрашивать пароль, пока он не будет введён верно.

Здесь на помощь приходит цикл while — условный цикл. Слово while в переводе с английского означает «пока».

Характеристика for while
Тип Счётный цикл Условный цикл
Когда использовать Известно число итераций Известно условие остановки
Проверка условия Автоматически по диапазону Перед каждой итерацией
Нужно ли обновлять переменную Нет Да, вручную

2. Синтаксис цикла while

Структура цикла while в Python очень похожа на условный оператор if:

while условие:
    # тело цикла — блок кода

Ключевые элементы:

  • Ключевое слово while.
  • Условие, которое возвращает True или False.
  • Двоеточие : в конце строки с условием.
  • Блок кода с отступом (4 пробела) — тело цикла.
Важно: условие проверяется перед каждой итерацией. Если оно ложно с самого начала, тело цикла не выполнится ни разу. Такой цикл называют циклом с предусловием.
Пример: выведем «Привет» 10 раз.
i = 0
while i < 10:
    print('Привет')
    i += 1

Вывод:

Привет
Привет
Привет
Привет
Привет
Привет
Привет
Привет
Привет
Привет

Как это работает:

  1. i = 0 — инициализируем счётчик.
  2. while i < 10: — проверяем, что 0 < 10. Истина — входим в цикл.
  3. print('Привет') — выводим сообщение.
  4. i += 1 — увеличиваем счётчик. Возвращаемся к шагу 2.
  5. Когда i станет равным 10, условие станет ложным, и цикл завершится.
Пример: цикл может не выполниться ни разу.
i = -1
while i > 0:
    print('Hello world!')

Ничего не выведется, потому что условие i > 0 ложно с самого начала.

3. while и if: в чём разница

# if — выполняется ОДИН РАЗ, если условие истинно
if i < 10:
    print("Hello")
 
# while — выполняется МНОГОКРАТНО, пока условие истинно
i = 0
while i < 10:
    print("Hello")
    i += 1

Блок if выполняется максимум один раз. Блок while — до тех пор, пока условие не станет ложным.

Типичная ошибка: в цикле while обязательно должно быть что-то, что сделает условие ложным. Иначе цикл никогда не завершится.

4. Сравнение for и while

Любой цикл for можно заменить циклом while (но не наоборот).

Пример: вывести числа от 0 до 100.
# С помощью for
for i in range(101):
    print(i)
 
# С помощью while
i = 0
while i < 101:
    print(i)
    i += 1
Пример: вывести числа, кратные 3, до 100.
# С помощью for
for i in range(0, 100, 3):
    print(i)
 
# С помощью while
i = 0
while i < 100:
    print(i)
    i += 3

Обратите внимание: в случае с while нам пришлось самостоятельно завести переменную i и вручную увеличивать её значение.

Правило выбора:

  • for — когда известно точное количество итераций.
  • while — когда известно условие остановки, но не количество итераций.

5. Считывание данных до стоп-значения

Очень часто в задачах на while данные считываются до тех пор, пока пользователь не введёт некоторое стоп-значение (sentinel value).

Пример: считаем числа и выводим их квадраты, пока не будет введено число −1.
num = int(input())
while num != -1:
    print('Квадрат вашего числа равен:', num * num)
    num = int(input())

Здесь важны два момента:

  1. Первичное считывание — читаем первое число до входа в цикл. Это даёт нам первое значение для проверки.
  2. Повторное считывание — читаем следующее число в конце тела цикла. Если забыть эту строку, num никогда не изменится, и цикл станет бесконечным.
Пример: сумма чисел до тех пор, пока не введено слово stop.
text = input()
total = 0
while text != 'stop':
    total += int(text)
    text = input()
print('Сумма чисел равна', total)

Пример работы:

5
10
3
stop
Сумма чисел равна 18

6. Бесконечные циклы

Если условие цикла никогда не станет ложным, такой цикл называется бесконечным. Бесконечный цикл продолжает выполняться до тех пор, пока программа не будет прервана.

Пример бесконечного цикла:

i = 0
total = 0
while i < 10:
    total += i

Переменная i внутри цикла не изменяется, поэтому условие i < 10 всегда истинно. Программа зависает.

Как прервать: в терминале нажмите Ctrl + C (KeyboardInterrupt). В IDLE можно закрыть окно или нажать Ctrl + F6.
Типичные причины бесконечного цикла:

  1. Забыли увеличить/уменьшить переменную внутри цикла.
  2. Условие проверяет не ту переменную, которая изменяется.
  3. Условие всегда истинно (например, while True без break).
Интересный факт: в 1996 году из-за ошибки в программном обеспечении (переполнение данных, связанное с преобразованием числа) взорвалась ракета «Ариан-5». Это показывает, что даже у опытных инженеров бывают проблемы с циклами и вычислениями.

7. Эмуляция цикла с постусловием (while True + break)

В Python нет цикла с постусловием (когда тело выполняется хотя бы один раз, а условие проверяется после). Однако его можно сэмулировать с помощью конструкции while True с оператором break:

while True:
    # тело цикла
    if условие_выхода:
        break
Пример: вывести числа от 0 до 9.
count = 0
while True:
    print(count)
    count += 1
    if count >= 10:
        break

Вывод:

0
1
2
3
4
5
6
7
8
9

Такая конструкция удобна, когда тело цикла должно выполниться хотя бы один раз, независимо от условия.

8. Обработка цифр числа с помощью while

Одно из самых частых применений цикла while — обработка цифр натурального числа. Опирается это на два оператора:

  • num % 10 — возвращает последнюю (младшую) цифру числа;
  • num // 10 — возвращает число без последней цифры.

Проследим для num = 123:

123 % 10 = 3    |    123 // 10 = 12
 12 % 10 = 2    |     12 // 10 = 1
  1 % 10 = 1    |      1 // 10 = 0

Как только число становится равным 0, все цифры обработаны — цикл можно завершать.

Стандартная структура цикла

num = int(input())
while num != 0:
    last_digit = num % 10       # получаем последнюю цифру
    # ... обработка last_digit
    num = num // 10             # удаляем последнюю цифру
Пример: вывести все цифры числа 12345 в обратном порядке (столбиком).
num = 12345
while num != 0:
    print(num % 10)
    num = num // 10

Вывод:

5
4
3
2
1

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

num = int(input())
total = 0
while num != 0:
    total += num % 10
    num //= 10
print("Сумма цифр:", total)

Пример работы:

Введите число: 1234
Сумма цифр: 10

Произведение цифр числа

num = int(input())
product = 1
while num != 0:
    product *= num % 10
    num //= 10
print("Произведение цифр:", product)
Обратите внимание: начальное значение суммы — 0, начальное значение произведения — 1. Это нейтральные элементы для сложения и умножения соответственно.

Проверка: есть ли в числе заданная цифра (флаг)

num = int(input("Введите число: "))
has_seven = False       # сигнальная метка (флаг)
 
while num != 0:
    last_digit = num % 10
    if last_digit == 7:
        has_seven = True
    num = num // 10
 
if has_seven:
    print('YES')
else:
    print('NO')

Пример работы:

Введите число: 1576
YES

Переворот числа

Используя формулу reversed_num = reversed_num * 10 + digit, можно собрать число в обратном порядке:

num = int(input())
reversed_num = 0
while num != 0:
    digit = num % 10
    reversed_num = reversed_num * 10 + digit
    num //= 10
print("Перевёрнутое число:", reversed_num)

Трассировка для num = 123:

Итерация digit reversed_num num
1 3 0×10+3 = 3 12
2 2 3×10+2 = 32 1
3 1 32×10+1 = 321 0
Применение: эта логика — основа проверки числа на палиндром (например, 121 — одинаково читается в обе стороны).

9. Условие в while с логическими операторами

Условие в цикле while, как и в условном операторе if, может содержать логические операторы or, and, not:

name = input()
while name != 'Валера' and name != 'Артур':
    print('Доступ запрещён')
    name = input()
print('Доступ разрешён')

Цикл продолжается до тех пор, пока имя не равно ни «Валера», ни «Артур».

10. Обработка цифр числа с помощью for

Помимо while, цифры числа можно обрабатывать циклом for, если заранее известно количество разрядов числа.

Формула для получения i-й цифры (слева направо, нумерация с 1):

(num // 10**(n-i)) % 10

где n — количество разрядов числа, i — номер цифры.

Количество разрядов находят через длину строки:

n = len(str(num))
Пример: вывести все цифры числа слева направо.
num = 8619
n = len(str(num))
 
for i in range(1, n + 1):
    digit = num // 10 ** (n - i) % 10
    print(f"{i}-я цифра равна {digit}")

Вывод:

1-я цифра равна 8
2-я цифра равна 6
3-я цифра равна 1
4-я цифра равна 9
Подход Плюсы Минусы
while num != 0 Не нужно знать длину числа, работает для любого количества разрядов Обрабатывает цифры справа налево
for i in range(1, n+1) Обрабатывает цифры слева направо Требует вычисления длины числа



Лабораторные работы

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

Лабораторная работа 1. Вывод цифр в обратном порядке
Задача: считайте натуральное число и выведите его цифры столбиком в обратном порядке.
Показать решение
n = int(input("Введите число: "))
while n != 0:
    print(n % 10)
    n //= 10

Пример работы:

Введите число: 12345
5
4
3
2
1

Пошаговое объяснение:

  1. Считываем число n.
  2. Пока n не равно 0 — извлекаем последнюю цифру через n % 10 и печатаем её.
  3. Удаляем последнюю цифру через n //= 10.
  4. Цикл повторяется, пока все цифры не будут обработаны.

Лабораторная работа 2. Сумма, количество, произведение и среднее цифр
Задача: для данного натурального числа вычислить:

  • сумму его цифр;
  • количество цифр;
  • произведение его цифр;
  • среднее арифметическое его цифр;
  • первую (старшую) цифру;
  • сумму первой и последней цифр.
Показать решение
n = int(input("Введите число: "))
original = n   # сохраняем оригинал для расчёта первой цифры
 
total = 0
count = 0
product = 1
 
while n != 0:
    digit = n % 10
    total += digit
    count += 1
    product *= digit
    n //= 10
 
# После цикла n стал равен 0. Восстанавливаем первую цифру из оригинала.
first_digit = original // (10 ** (count - 1))
last_digit = original % 10
 
average = total / count
 
print("Сумма:", total)
print("Количество:", count)
print("Произведение:", product)
print("Среднее:", average)
print("Первая цифра:", first_digit)
print("Сумма первой и последней:", first_digit + last_digit)

Пример работы:

Введите число: 5678
Сумма: 26
Количество: 4
Произведение: 1680
Среднее: 6.5
Первая цифра: 5
Сумма первой и последней: 13

Пошаговое объяснение:

  1. Инициализируем total = 0, count = 0, product = 1. Запоминаем original = n.
  2. В цикле извлекаем цифры справа налево, накапливаем сумму, счётчик и произведение.
  3. После цикла вычисляем первую цифру: original // 10**(count-1).
  4. Последняя цифра — это original % 10.
  5. Среднее = сумма / количество.

Лабораторная работа 3. Проверка одинаковых цифр
Задача: определить, состоит ли число из одинаковых цифр (например, 111 — YES, 112 — NO).
Показать решение
n = int(input("Введите число: "))
 
if n == 0:
    print("YES")   # 0 — одна цифра, считается тривиально одинаковым
else:
    last_digit = n % 10
    n //= 10
    is_identical = True
 
    while n != 0:
        digit = n % 10
        if digit != last_digit:
            is_identical = False
            break
        n //= 10
 
    if is_identical:
        print("YES")
    else:
        print("NO")

Пример работы:

Введите число: 111111
YES
Введите число: 111112
NO

Пошаговое объяснение:

  1. Отдельно обрабатываем случай n == 0.
  2. Запоминаем последнюю цифру как эталон (last_digit) и удаляем её из числа.
  3. Устанавливаем флаг is_identical = True.
  4. Перебираем оставшиеся цифры: если хотя бы одна отличается — сбрасываем флаг и прерываем цикл через break.
  5. Выводим результат в зависимости от значения флага.

Лабораторная работа 4. Максимальная и минимальная цифра числа
Задача: для данного числа найти его максимальную и минимальную цифру.
Показать решение
n = int(input("Введите число: "))
 
max_digit = n % 10     # инициализируем последней цифрой
min_digit = n % 10
n = n // 10            # удаляем её из дальнейшей обработки
 
while n != 0:
    digit = n % 10
    if digit > max_digit:
        max_digit = digit
    if digit < min_digit:
        min_digit = digit
    n = n // 10
 
print("Максимальная цифра:", max_digit)
print("Минимальная цифра:", min_digit)

Пример работы:

Введите число: 53258
Максимальная цифра: 8
Минимальная цифра: 2

Пошаговое объяснение:

  1. В качестве начального значения max_digit и min_digit берём последнюю цифру числа.
  2. Удаляем её из числа, чтобы не сравнивать с самой собой.
  3. В цикле извлекаем очередную цифру и сравниваем с текущими максимумом и минимумом.
  4. Если цифра больше max_digit — обновляем максимум. Если меньше min_digit — обновляем минимум.



Самостоятельные задания

Решите следующие задачи самостоятельно. Для проверки используйте примеры вывода.

Задание 1. Обратный отсчёт
Условие: считайте число n и выведите все числа от n до 1 с помощью цикла while.

Пример вывода:

Введите n: 5
5 4 3 2 1

Задание 2. Сумма чисел до нуля
Условие: считывайте целые числа, пока не будет введён 0. Выведите сумму всех введённых чисел (не считая 0).

Пример вывода:

5
10
3
0
Сумма: 18

Задание 3. Подсчёт чётных цифр
Условие: считайте число и подсчитайте, сколько его цифр являются чётными.

Пример вывода:

Введите число: 1234
Количество чётных цифр: 2
Введите число: 1357
Количество чётных цифр: 0

Задание 4. Проверка наличия цифры
Условие: считайте число и цифру. Проверьте, содержится ли эта цифра в числе.

Пример вывода:

Введите число: 4567
Введите цифру: 5
YES

Задание 5. Вторая цифра справа
Условие: считайте натуральное число n (n > 9) и выведите его вторую цифру справа.

Пример вывода:

Введите число: 4567
Вторая цифра справа: 6
Введите число: 123
Вторая цифра справа: 2

Задание 6. Проверка на палиндром
Условие: считайте число и определите, является ли оно палиндромом (читается одинаково слева направо и справа налево).

Пример вывода:

Введите число: 121
YES
Введите число: 123
NO

Подсказка: сравните оригинальное число с его перевёрнутой версией.

Задание 7. Сумма цифр равна произведению
Условие: считайте число и вычислите сумму и произведение его цифр. Если они равны, выведите «YES», иначе — «NO». Например, для 123: сумма = 6, произведение = 6 → «YES».

Пример вывода:

Введите число: 123
YES
Введите число: 456
NO

Задание 8. Проверка пароля
Условие: программа должна запрашивать пароль до тех пор, пока пользователь не введёт правильный пароль «python123». При успешном вводе вывести «Доступ разрешён».

Пример вывода:

Введите пароль: hello
Неверно, попробуйте снова
Введите пароль: world
Неверно, попробуйте снова
Введите пароль: python123
Доступ разрешён

Задание 9. Сумма квадратов цифр
Условие: считайте число и найдите сумму квадратов его цифр.

Пример вывода:

Введите число: 123
Сумма квадратов цифр: 14

Пояснение: 1² + 2² + 3² = 1 + 4 + 9 = 14.

Задание 10. Цифры от большего к меньшему
Условие: считайте число и выведите все его цифры в порядке убывания.

Пример вывода:

Введите число: 53258
8 5 3 2 2

Подсказка: сначала соберите цифры в список, отсортируйте его и выведите.

Задание 11. Подсчёт чётных и нечётных цифр
Условие: считайте число и подсчитайте количество чётных и нечётных цифр в нём.

Пример вывода:

Введите число: 123456
Чётных цифр: 3
Нечётных цифр: 3

Задание 12. Поиск цифры 7 с использованием флага
Условие: считайте число и проверьте, есть ли в нём цифра 7. Используйте переменную-флаг.

Пример вывода:

Введите число: 1576
YES
Введите число: 1234
NO

Задание 13. Количество разрядов числа
Условие: считайте число и выведите количество разрядов (цифр) в нём. Используйте цикл while.

Пример вывода:

Введите число: 987654
Количество разрядов: 6

Подсказка: на каждой итерации делите число на 10 и увеличивайте счётчик.

Задание 14. Удаление нулей из числа
Условие: считайте число и составьте новое число, удалив из него все нули. Например, из 102030 получается 123.

Пример вывода:

Введите число: 102030
Новое число: 123

Подсказка: собирайте новое число, прибавляя цифру справа к текущему результату.

Задание 15. Ввод чисел до слова «stop»
Условие: считывайте целые числа, пока пользователь не введёт слово stop. Выведите сумму и количество введённых чисел.

Пример вывода:

5
10
3
stop
Сумма: 18
Количество: 3

Задание 16. Проверка: возрастает ли последовательность цифр
Условие: считайте число и проверьте, идут ли его цифры строго по возрастанию слева направо (например, 1234 — YES, 1232 — NO).

Пример вывода:

Введите число: 1234
YES
Введите число: 1232
NO

Подсказка: обрабатывайте цифры справа налево и сравнивайте каждую с предыдущей.