← Назад к вопросам

В Python циклы с предусловием или с постусловием

1.3 Junior🔥 151 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Циклы в Python: с предусловием vs постусловием

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

Циклы с предусловием (while)

Это самый распространённый тип цикла в Python. Условие проверяется ДО выполнения тела:

# Цикл with предусловием
i = 0
while i < 5:  # Проверяем ДО выполнения
    print(f"Итерация {i}")
    i += 1

# Вывод:
# Итерация 0
# Итерация 1
# Итерация 2
# Итерация 3
# Итерация 4

Если условие false с самого начала, тело цикла не выполнится вообще:

i = 10
while i < 5:  # Условие false
    print(f"Это не выполнится")
    i += 1

print("Цикл не выполнился ни разу")

Циклы с постусловием (do-while)

В языках вроде C, Java, JavaScript есть конструкция do-while, которая выполняет тело МИНИМУМ один раз, а потом проверяет условие:

// C
do {
    printf("Выполнилось");
} while (x < 5);  // Проверяем ПОСЛЕ выполнения

Тело выполнится минимум один раз, даже если условие изначально false.

Python НЕ имеет do-while

В Python нет встроенного do-while. Дизайнеры Python считали, что это излишнее усложнение, потому что:

  1. Можно использовать while True с break
  2. Код становится понятнее
  3. Меньше опасных ошибок

Как эмулировать do-while в Python

Способ 1: while True с break

# Аналог do-while
while True:
    print("Выполнилось")
    if not (x < 5):  # Условие выхода (инвертируем условие)
        break
    x += 1

Способ 2: Выполнить один раз, потом while

# Более читаемый способ
user_input = None
while True:
    user_input = input("Введи число: ")
    if user_input.isdigit():
        break
    print("Ошибка: введи число")

print(f"Ты ввёл: {user_input}")

Способ 3: Custom do-while функция

def do_while(func, condition):
    """Эмулирует do-while цикл"""
    func()  # Выполняем один раз
    while condition():
        func()

# Использование
i = 10
def my_func():
    global i
    print(f"i = {i}")
    i -= 1

do_while(my_func, lambda: i > 0)

# Вывод:
# i = 10
# i = 9
# i = 8
# ... и т.д.

Практический пример: валидация пользовательского ввода

Это типичный case для do-while:

# ❌ Неправильно: дублирование кода
user_input = input("Введи возраст (1-120): ")
while not (1 <= int(user_input) <= 120):
    print("Ошибка!")
    user_input = input("Введи возраст (1-120): ")

age = int(user_input)

# ✅ Правильно: используем while True
while True:
    user_input = input("Введи возраст (1-120): ")
    try:
        age = int(user_input)
        if 1 <= age <= 120:
            break
        print("Возраст должен быть от 1 до 120")
    except ValueError:
        print("Ошибка: введи число")

print(f"Твой возраст: {age}")

for vs while в Python

В Python чаще используют for с итерируемыми объектами:

# Вместо while с индексом
i = 0
while i < 5:
    print(f"Итерация {i}")
    i += 1

# ✅ Используй for
for i in range(5):
    print(f"Итерация {i}")

# Или по элементам списка
items = ['a', 'b', 'c']
for item in items:
    print(item)

# Вместо while с индексом
i = 0
while i < len(items):
    print(items[i])
    i += 1

Бесконечный цикл (while True)

Это идеоматично в Python:

# Сервер, который работает бесконечно
while True:
    try:
        request = get_request_from_client()
        response = handle_request(request)
        send_response(response)
    except KeyboardInterrupt:
        print("Сервер остановлен")
        break
    except Exception as e:
        print(f"Ошибка: {e}")
        continue

break и continue

# break: выход из цикла
for i in range(10):
    if i == 5:
        break  # Выходим из цикла
    print(i)  # Печатает 0, 1, 2, 3, 4

# continue: переход к следующей итерации
for i in range(10):
    if i % 2 == 0:
        continue  # Пропускаем чётные
    print(i)  # Печатает 1, 3, 5, 7, 9

else в циклах

В Python циклы могут иметь блок else, который выполняется если цикл закончился нормально (без break):

# Поиск элемента
for item in [1, 2, 3, 4, 5]:
    if item == 10:
        print("Нашли 10")
        break
else:
    print("10 не найден")  # Выполнится, потому что не было break

# С условием
for i in range(5):
    if i == 3:
        break
else:
    print("Цикл завершился нормально")  # НЕ выполнится

print("Вышли из цикла")

List Comprehension вместо циклов

Для построения списков лучше использовать comprehensions:

# ❌ С циклом
squares = []
for i in range(10):
    squares.append(i ** 2)

# ✅ List comprehension
squares = [i ** 2 for i in range(10)]

# С условием
even_squares = [i ** 2 for i in range(10) if i % 2 == 0]

# Dict comprehension
user_ages = {user.name: user.age for user in users}

# Set comprehension
unique_lengths = {len(word) for word in words}

# Generator expression
generator = (i ** 2 for i in range(1000000))  # Ленивое вычисление

Производительность циклов

import timeit

# while цикл
while_code = """
i = 0
while i < 1000:
    i += 1
"""

# for цикл
for_code = """
for i in range(1000):
    pass
"""

while_time = timeit.timeit(while_code, number=10000)
for_time = timeit.timeit(for_code, number=10000)

print(f"while: {while_time}")
print(f"for: {for_time}")
# for обычно быстрее

Лучшие практики

  1. Используй for с итерируемыми объектами когда возможно
  2. Используй while для условных циклов, где нет известного количества итераций
  3. Используй while True с break для эмуляции do-while
  4. Избегай бесконечных циклов без чёткого условия выхода
  5. List comprehensions для построения списков (более читаемо и быстро)

Вывод

В Python нет встроенного do-while, потому что Гвидо ван Россум считал, что это добавляет ненужную сложность. Вместо этого используют while True с break, что в Python считается идиоматичным. Это не ограничение, а философия дизайна языка: simple is better than complex.