Цикл for в Python: полное руководство с практическими задачами

Раздел: Основы Python -> Основы Python: циклы

Цикл for с счетчиком в Python: основные подходы

Как организовать перебор чисел от 0 до N в цикле for?

Самый эффективный способ для выполнения фиксированного количества итераций с использованием функции range(). Она создает последовательность чисел, которую можно сразу обойти в цикле.


for i in range(5):
    print(i)
  

задача python циклы цикл со счетчиком for (задача на цикл for в python)

Результат выполнения:

0
1
2
3
4
  

задачи с циклом while python (задачи с циклом while в python)

Функция range(stop) генерирует числа от 0 до stop-1. Первый параметр start (по умолчанию 0) задает начальное значение, второй step - шаг. Например, range(2, 10, 3) вернет 2, 5, 8.

Типичная ошибка: забыть, что range(stop) не включает stop. Если нужно дойти до 5 включительно, используйте range(6).

Также часто путают порядок аргументов: сначала start, потом stop, затем step.

Как перебрать элементы списка вместе с их индексами?

Классический подход - использовать range(len(list)):


fruits = ['яблоко', 'банан', 'вишня']
for idx in range(len(fruits)):
    print(idx, fruits[idx])
  
0 яблоко
1 банан
2 вишня
  

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

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

Также опасно изменять длину списка внутри цикла (добавлять/удалять элементы), это может привести к пропуску или повторению.

Как одновременно получить и индекс, и значение элемента без использования range?

Функция enumerate() создает пары (индекс, значение).


fruits = ['яблоко', 'банан', 'вишня']
for idx, fruit in enumerate(fruits):
    print(f'{idx}: {fruit}')
  
0: яблоко
1: банан
2: вишня
  

Этот способ считается более Pythonic и читаемым. Можно задать начальный индекс параметром start.

Ошибка: распаковка кортежа требует двух переменных; если забыть скобки, будет ошибка.

Как перебрать символы строки по порядку с индексом?

Строка - итерируемый объект, поэтому можно применить enumerate:


word = 'Python'
for idx, ch in enumerate(word):
    print(f'{idx} -> {ch}')
  
0 -> P
1 -> y
2 -> t
3 -> h
4 -> o
5 -> n
  

Либо использовать range(len(word)). Разница в том, что enumerate сразу дает символ.

Частая ошибка: изменять строку внутри цикла, но строки неизменяемы - это вызовет TypeError.

Как досрочно прервать цикл при выполнении условия?

Оператор break немедленно завершает цикл. Пример: поиск первого четного числа.


numbers = [1, 3, 5, 8, 9]
for n in numbers:
    if n % 2 == 0:
        print('Найдено четное:', n)
        break
  
Найдено четное: 8
  

Без break цикл прошел бы весь список. Используется при поиске, валидации.

Ошибка: случайное использование break вместо continue приводит к преждевременному выходу.

Как пропускать отдельные итерации, не прерывая весь цикл?

Оператор continue переходит к следующей итерации. Пример: печать только четных чисел.


for i in range(7):
    if i % 2 != 0:
        continue
    print(i)
  
0
2
4
6
  

Типичная ошибка: бесконечный цикл, если забыть увеличить счетчик в while, но в for счетчик обновляется автоматически.

Как организовать вложенные циклы для работы с двумерными структурами?

Внутри одного цикла for можно расположить другой. Пример: вывод таблицы умножения 3x3.


for i in range(1, 4):
    for j in range(1, 4):
        print(i * j, end=' ')
    print()
  
1 2 3 
2 4 6 
3 6 9 
  

Внешний цикл - строки, внутренний - столбцы. Важно понимать порядок выполнения.

Ошибка: забыть сбросить переменную внутреннего цикла или использовать одинаковые имена счетчиков.

Как выполнить код после завершения цикла, если не было break?

Блок else после for выполняется, только если цикл завершился естественно (без break).


for n in [2, 4, 6]:
    if n % 2 != 0:
        print('Нечетное найдено')
        break
else:
    print('Все числа четные')
  
Все числа четные
  

Полезно при проверке наличия элемента.

Забывают про else, полагаясь на флаги, что усложняет код.

Как параллельно обойти два списка одинаковой длины?

Функция zip() объединяет элементы в кортежи.


names = ['Анна', 'Борис', 'Виктор']
scores = [85, 92, 78]
for name, score in zip(names, scores):
    print(f'{name}: {score}')
  
Анна: 85
Борис: 92
Виктор: 78
  

Если списки разной длины, zip останавливается на самом коротком.

Ошибка: неявное использование zip_longest из itertools, если нужно продолжить до самого длинного.

Как пройти по ключам словаря?

Словарь по умолчанию итерируется по ключам. Можно также использовать .keys(), .values(), .items().


capitals = {'Россия': 'Москва', 'Франция': 'Париж'}
for country in capitals:
    print(country)
for country, city in capitals.items():
    print(f'{country}: {city}')
  
Россия
Франция
Россия: Москва
Франция: Париж
  

Ошибка: изменение словаря (добавление/удаление ключей) во время итерации вызывает RuntimeError.

Расширенные примеры использования цикла for

Вычисление факториала числа с помощью цикла for

Факториал n! = 1 * 2 * ... * n. Цикл с счетчиком от 1 до n:

Пример

def factorial(n):
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

print(factorial(5))
  
120
  

Обратите внимание на range(1, n+1) - чтобы включить n.

Проблема: при n=0 цикл не выполнится, result останется 1 - это корректно (0! = 1).

Проверка числа на простоту с помощью цикла for и break

Простое число делится только на 1 и на себя. Достаточно проверить делители от 2 до sqrt(n).

Пример

import math
def is_prime(num):
    if num < 2:
        return False
    for d in range(2, int(math.sqrt(num)) + 1):
        if num % d == 0:
            return False
    return True

for n in [2, 3, 4, 17, 25]:
    print(f'{n} -> {is_prime(n)}')
  
2 -> True
3 -> True
4 -> False
17 -> True
25 -> False
  

Используется range(2, sqrt+1) и break (через return).

Типичная ошибка: проверять все делители до num, что неэффективно. Использование math.sqrt ускоряет.

Поиск всех дубликатов в списке с помощью вложенных циклов

Перебор пар индексов i и j (i < j) для поиска одинаковых элементов.

Пример

arr = [1, 3, 2, 3, 4, 1]
duplicates = []
for i in range(len(arr)):
    for j in range(i + 1, len(arr)):
        if arr[i] == arr[j] and arr[i] not in duplicates:
            duplicates.append(arr[i])
print(duplicates)
  
[1, 3]
  

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

Ошибка: если не ограничить j > i, будут повторные сравнения и лишние итерации.

Генерация последовательности Фибоначчи до N членов

Используем цикл for с аккумуляцией двух предыдущих значений.

Пример

def fibonacci(n):
    a, b = 0, 1
    result = []
    for _ in range(n):
        result.append(a)
        a, b = b, a + b
    return result

print(fibonacci(10))
  
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
  

Счетчик _ используется, когда переменная не нужна.

Распространенная ошибка: путать порядок обновления a и b, что приводит к неверной последовательности.

Транспонирование матрицы с использованием вложенных циклов

Пусть дана матрица (список списков). Транспонирование - превращение строк в столбцы.

Пример

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
transposed = []
for col in range(len(matrix[0])):
    new_row = []
    for row in range(len(matrix)):
        new_row.append(matrix[row][col])
    transposed.append(new_row)
print(transposed)
  
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
  

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

Ошибка: разная длина строк матрицы приведет к IndexError. Нужна проверка.

Перебор всех подстрок фиксированной длины (скользящее окно)

Для строки 'abcde' и длины окна 3 вывести все подстроки из трех символов.

Пример

s = 'abcde'
window_size = 3
for i in range(len(s) - window_size + 1):
    print(s[i:i+window_size])
  
abc
bcd
cde
  

Границы range вычисляются так, чтобы последний индекс не вышел за длину строки.

Ошибка: если window_size больше длины строки, цикл не выполнится, но срез вернет пустую строку, что неочевидно.

Вывод ASCII-арта: треугольник из звездочек

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

Пример

height = 5
for i in range(height):
    for j in range(i + 1):
        print('*', end='')
    print()
  
*
**
***
****
*****
  

Количество звездочек в строке равно номеру строки + 1.

Типичная ошибка: неправильный диапазон внутреннего цикла (например, range(height) вместо range(i+1)).

Задача на цикл for в Python - comments

En
задача python циклы цикл со счетчиком for (python)