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

Какие циклы есть в Python?

1.0 Junior🔥 161 комментариев
#Python Core

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

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

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

Какие циклы есть в Python?

В Python есть несколько способов организовать повторяющееся выполнение кода. Давайте разберём все основные типы циклов.

1. Цикл for

Цикл for используется для итерации по элементам итерируемых объектов (списки, строки, диапазоны и т.д.).

# Итерация по списку
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# Итерация по строке (каждый символ)
for char in "hello":
    print(char)  # h, e, l, l, o

# Итерация по диапазону (range)
for i in range(5):  # 0, 1, 2, 3, 4
    print(i)

# range с началом и шагом
for i in range(1, 10, 2):  # 1, 3, 5, 7, 9
    print(i)

# Получить индекс и значение
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")  # 0: apple, 1: banana, 2: cherry

Итерация по словарю:

user = {"name": "Alice", "age": 30, "city": "NYC"}

# Итерация по ключам (по умолчанию)
for key in user:
    print(key)  # name, age, city

# Итерация по значениям
for value in user.values():
    print(value)  # Alice, 30, NYC

# Итерация по парам (ключ, значение)
for key, value in user.items():
    print(f"{key}: {value}")  # name: Alice, age: 30, city: NYC

Вложенные циклы:

# Таблица умножения
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i} * {j} = {i*j}", end="  ")
    print()  # новая строка

2. Цикл while

Цикл while выполняется, пока условие истинно. Используется, когда число итераций неизвестно.

# Простой while
count = 0
while count < 5:
    print(count)
    count += 1  # 0, 1, 2, 3, 4

# Ввод данных до корректного значения
while True:
    user_input = input("Введите число (0-10): ")
    try:
        num = int(user_input)
        if 0 <= num <= 10:
            break  # выход из цикла
        else:
            print("Число вне диапазона")
    except ValueError:
        print("Некорректный ввод")

# Работа с файлом
with open('data.txt') as f:
    while True:
        line = f.readline()
        if not line:  # конец файла
            break
        print(line.strip())

3. Операторы управления циклом

break — выход из цикла:

# Поиск элемента
for num in [1, 2, 3, 4, 5]:
    if num == 3:
        break  # выход при нахождении
    print(num)  # выведет 1, 2

# Выход из вложенного цикла
for i in range(3):
    for j in range(3):
        if i == 1 and j == 1:
            break  # выходит только из внутреннего цикла
        print(f"({i},{j})", end=" ")
    print()  # новая строка после каждой строки i

continue — переход к следующей итерации:

# Пропуск чётных чисел
for num in range(1, 6):
    if num % 2 == 0:
        continue  # пропустить эту итерацию
    print(num)  # выведет 1, 3, 5

# Пропуск пустых строк
with open('data.txt') as f:
    for line in f:
        if line.strip() == '':
            continue  # пропустить пустые строки
        print(line.strip())

else в цикле:

# else выполняется, если цикл завершился нормально (без break)
for num in [1, 2, 3, 4, 5]:
    if num == 10:
        break
else:
    print("10 не найден")  # будет выведено

# Практический пример
for user_id in user_ids:
    if user_exists(user_id):
        print(f"Пользователь {user_id} найден")
        break
else:
    print("Ни один пользователь не найден")

4. Функциональные подходы (альтернативы циклам)

List comprehension (списковое выражение):

# Вместо:
squares = []
for num in range(5):
    squares.append(num ** 2)

# Пишем:
squares = [num ** 2 for num in range(5)]  # [0, 1, 4, 9, 16]

# С условием
evens = [num for num in range(10) if num % 2 == 0]  # [0, 2, 4, 6, 8]

# Вложенный список
matrix = [[i*j for j in range(3)] for i in range(3)]

Dict comprehension:

# Создание словаря
squares_dict = {num: num**2 for num in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# Инвертирование ключей и значений
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

Set comprehension:

# Множество уникальных квадратов
squares_set = {num**2 for num in [1, 2, 2, 3, 3, 3]}
# {1, 4, 9}

map(), filter(), reduce():

# map — применить функцию ко всем элементам
nums = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, nums))  # [1, 4, 9, 16, 25]

# filter — оставить только элементы, соответствующие условию
evens = list(filter(lambda x: x % 2 == 0, nums))  # [2, 4]

# reduce — свернуть в одно значение
from functools import reduce
product = reduce(lambda x, y: x * y, nums)  # 120 (1*2*3*4*5)

5. Итераторы и генераторы

Создание собственного итератора:

class CountUp:
    def __init__(self, max):
        self.current = 1
        self.max = max
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current > self.max:
            raise StopIteration
        result = self.current
        self.current += 1
        return result

for num in CountUp(3):
    print(num)  # 1, 2, 3

Генератор (generator) — ленивый итератор:

def count_up(max):
    current = 1
    while current <= max:
        yield current  # возвращает значение, сохраняет состояние
        current += 1

for num in count_up(3):
    print(num)  # 1, 2, 3

# Генератор экономит память
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for fib in fibonacci(5):
    print(fib)  # 0, 1, 1, 2, 3

6. Сравнение подходов:

# Задача: получить квадраты чисел 1-5

# 1. Традиционный for
result = []
for i in range(1, 6):
    result.append(i ** 2)

# 2. List comprehension — более «питонический»
result = [i ** 2 for i in range(1, 6)]

# 3. map() с лямбдой
result = list(map(lambda i: i ** 2, range(1, 6)))

# 4. Генератор
result = (i ** 2 for i in range(1, 6))

Практические советы:

  1. for — когда знаете количество итераций
  2. while — когда число итераций зависит от условия
  3. List comprehension — когда создаёте новый список (читаемо и быстро)
  4. Генератор — для больших последовательностей (экономия памяти)
  5. break/continue — для управления потоком выполнения
  6. else в цикле — когда нужна логика после нормального завершения