Курс Python → Цикл for в Python


Цикл for в Python

Python — это язык, который любят за его читаемость и простоту. И одна из причин этой простоты — цикл for. Если вы когда-нибудь задумывались, как автоматизировать рутинные задачи, типа обработки кучи файлов или перебора данных из таблицы, то цикл for — ваш главный помощник. Он как опытный экспедитор: берет вас за руку и проводит по всем элементам списка, строки или другого «путешествия» по данным. Забудьте про нудные ручные операции, for сделает всё сам, причем быстро. Это, ну, прям очень удобно! Да, есть еще цикл while, который тоже хорош, но for часто более интуитивен, особенно когда вы точно знаете, сколько шагов нужно пройти или по каким элементам пробежаться. Это как выбирать между компасом и картой — иногда одно проще, иногда другое. Но for, честно, спасает кучу времени и нервов. В этой статье мы копнем поглубже, как он работает, где его применять и как не запутаться в этих, типа, самых основах.

Уже интересно? Тогда поехали разбираться, почему for — это прямо маст-хэв для любого, кто работает с кодом, даже если вы только начинаете свой путь в IT. Мы покажем, как с его помощью можно легко и непринужденно автоматизировать кучу всего, что раньше казалось неподъемным. Так что готовьтесь, будет много практики и минимум занудства!

Основы синтаксиса

Итак, давайте разберемся, как же этот `for` вообще выглядит и что значат эти загадочные слова. Основная конструкция цикла for в Python выглядит так: for <переменная_цикла> in <итерируемый_объект>:. Звучит, может, чуть мудрено, но на деле всё просто. for — это просто команда начать цикл. in — это как предлог, который связывает нашу переменную с тем, по чему мы будем «ходить». А вот <переменная_цикла> — это такая временная «коробочка», куда на каждом шаге цикла будет попадать очередной элемент из нашего <итерируемого_объекта>. Этот объект может быть чем угодно: строкой, списком, кортежем, словарем, да чем угодно, что можно перебирать. Важнейший момент в Python — это отступы. Все, что находится внутри цикла, должно быть сдвинуто вправо. Это не просто для красоты, это определяет, какие строки кода принадлежат циклу, а какие — уже нет. Серьезно, без правильных отступов ваш код просто не запустится. Как-то так:

  • for буква in "Привет": — здесь буква будет принимать значения ‘П’, ‘р’, ‘и’, ‘в’, ‘е’, ‘т’ по очереди.
  • for число in [1, 2, 3]: — тут число будет сначала 1, потом 2, потом 3.

Прям магия какая-то, да? Без всяких заморочек. Вы просто говорите, что хотите сделать с каждым элементом, а for сам позаботится о том, чтобы пройтись по всем.

Помните про отступы! Они — ваш лучший друг в Python. Неправильный отступ — это как неправильный поворот на автостраде: приведёт к ошибкам. Просто запомните: всё, что внутри цикла, сдвигается вправо. И чем больше практики, тем быстрее это войдет в привычку. Вы даже не заметите, как начнете писать идеальный отступной код.

Магия range(): Создаем последовательности чисел

Когда нам нужно пройтись по числам, например, 10 раз, или пронумеровать что-то, на помощь приходит функция range(). Это такой генератор чисел, который идеально работает с циклом for. У нее есть три варианта использования, ну, или три «режима»:

  1. range(stop): Создает последовательность от 0 до `stop-1`. Например, range(5) даст нам числа 0, 1, 2, 3, 4.
  2. range(start, stop): Создает последовательность от `start` до `stop-1`. Например, range(2, 7) даст 2, 3, 4, 5, 6.
  3. range(start, stop, step): А это уже совсем круто. Можно задать начальное значение, конечное и шаг. Например, range(1, 10, 2) выдаст 1, 3, 5, 7, 9. А если сделать range(10, 0, -1), то получим обратный отсчет: 10, 9, 8, …, 1.

range() очень эффективна, потому что она не создает сразу весь список чисел в памяти, а генерирует их по мере необходимости. Это значит, что даже если вам нужна последовательность из миллиона чисел, ваш компьютер не зависнет. Круто, правда? Так что, если надо перебрать что-то определенное количество раз, range() — ваш лучший друг. Это как иметь бесконечный набор кубиков, из которых можно собрать любую числовую цепочку.

Представьте, вам нужно вывести таблицу умножения на 5. Без range() пришлось бы писать кучу строчек. А с ней? Пару строк — и готово. Вот такая магия чисел. Используйте range() — это просто, удобно и очень мощно.

Итерация по строкам и спискам

Строки и списки — это, наверное, самые частые гости в наших программах. И цикл for умеет работать с ними просто блестяще. Когда вы используете for со строкой, он будет перебирать каждый символ этой строки по очереди. Это значит, что вы можете легко обработать каждый символ, найти нужный, заменить его или просто посчитать, сколько раз встречается определенный символ. Например, чтобы посчитать количество гласных в слове, можно пройтись циклом for по каждому символу и проверить, является ли он гласной. Просто и элегантно!

То же самое со списками. Цикл for проходит по каждому элементу списка, будь то число, строка, другой список или даже целый объект. Это позволяет вам легко выполнять однотипные операции над всеми элементами. Например, увеличить каждое число в списке на 10, или собрать все имена из списка студентов в новую строку. По сути, это такой «пакетный режим» для обработки данных. Вместо того чтобы писать код для первого, потом для второго, потом для третьего элемента, вы пишете один раз, а for делает всю механическую работу.

Примеры? Да пожалуйста!


# Перебор строки
приветствие = "Добро пожаловать!"
for символ in приветствие:
    print(символ, end='-') # Выведет: Д-о-б-р-о- -п-о-ж-а-л-о-в-а-т-ь-!

# Перебор списка чисел
числа = [10, 20, 30, 40, 50]
сумма = 0
for число in числа:
    сумма += число
print(f"\nСумма всех чисел: {сумма}") # Выведет: Сумма всех чисел: 150

 

Видите, как просто? Главное — понять саму идею: for берет один элемент за раз и дает вам его. А дальше — дело вашей фантазии, что с ним сделать.

Словари и циклы for: ключи, значения и пары

Со словарями в Python — отдельная история, и цикл for тут тоже не подкачал. Дело в том, что словари — это такие «умные» коллекции, где есть пары «ключ-значение». И перебирать их можно по-разному, в зависимости от того, что вам нужно.

Вот основные способы:

  • Перебор ключей: Если просто написать for ключ in словарь:, то цикл пройдет по всем ключам словаря. Это, типа, стандартное поведение.
  • Перебор значений: Если вам нужны только значения, а ключи не интересны, используйте метод .values(). Пример: for значение in словарь.values():.
  • Перебор пар ключ-значение: А вот это, наверное, самый частый и полезный сценарий. Используется метод .items(), который возвращает кортежи из пары (ключ, значение). Выглядит это так: for ключ, значение in словарь.items():. Тут Python молодец, он прямо распаковывает кортеж в две переменные сразу — очень удобно!

Давайте посмотрим на примере. Представьте, у нас есть словарь с ценами на фрукты:


цены_фруктов = {
    "яблоко": 50,
    "банан": 30,
    "апельсин": 70
}

# Перебор ключей (стандартно)
print("Ключи:")
for фрукт in цены_фруктов:
    print(фрукт)
# Выведет:
# Ключи:
# яблоко
# банан
# апельсин

# Перебор значений
print("\nЦены:")
for цена in цены_фруктов.values():
    print(цена)
# Выведет:
# Цены:
# 50
# 30
# 70

# Перебор пар ключ-значение
print("\nФрукт - Цена:")
for фрукт, цена in цены_фруктов.items():
    print(f"{фрукт}: {цена} руб.")
# Выведет:
# Фрукт - Цена:
# яблоко: 50 руб.
# банан: 30 руб.
# апельсин: 70 руб.

 

Как видите, с .items() работать с парами ключ-значение получается супер-наглядно. Это прямо находка для работы с конфигурациями, настройками или любыми данными, где важна связь между двумя вещами.

Так что, если у вас есть словарь, не бойтесь его перебирать. Python предоставляет все удобства, чтобы сделать это максимально просто и понятно. Просто выбирайте нужный метод — keys(), values() или items() — и вперед!

Управление циклом: break, continue и else

Иногда в процессе работы цикла нам нужно немного его подкорректировать, ну, типа, вмешаться. Для этого есть три волшебных слова: break, continue и блок else.

break — это как кнопка «Стоп». Если вы встретили break, цикл немедленно прекращает свою работу, даже если еще остались необработанные элементы. Это полезно, когда вы нашли то, что искали, и дальше продолжать бессмысленно. Например, ищем в большом списке число 100. Как только нашли — break, и все, конец.

continue — это немного другое. Это как «пропустить этот шаг». Когда Python встречает continue, он пропускает оставшуюся часть кода в текущей итерации цикла и переходит к следующей. Это полезно, когда вы хотите пропустить обработку каких-то конкретных элементов. Например, если вам нужно обработать все числа, кроме отрицательных, вы можете поставить continue, если число отрицательное.

А теперь про else в цикле for. Это такая штука, которая выполняется, ТОЛЬКО ЕСЛИ цикл завершился своим ходом, то есть без использования break. То есть, если цикл «догулял» до конца сам, без прерываний, то выполнится код в блоке else. Это удобно, например, если вы искали что-то, и если цикл закончился, а вы ничего не нашли (то есть break не сработал), то в блоке else можно вывести сообщение «Ничего не найдено».

Примеры, чтобы стало совсем понятно:


# Пример с break
for i in range(1, 10):
    if i == 5:
        print("Нашли 5, прерываемся!")
        break
    print(i, end=" ")
# Вывод: 1 2 3 4 Нашли 5, прерываемся!

# Пример с continue
for i in range(1, 10):
    if i % 2 == 0: # Если число четное
        continue   # Пропускаем его
    print(i, end=" ")
# Вывод: 1 3 5 7 9 

# Пример с else
for i in range(1, 5):
    print(i, end=" ")
else:
    print("\nЦикл завершен без break!")
# Вывод: 1 2 3 4 
#        Цикл завершен без break!

# Пример с break и else (else не сработает)
for i in range(1, 5):
    print(i, end=" ")
    if i == 3:
        break
else:
    print("\nЦикл завершен без break!")
# Вывод: 1 2 3 

 

Эти три конструкции — break, continue и else — дают вам полный контроль над потоком выполнения цикла. Освоив их, вы сможете писать гораздо более гибкий и умный код. Это как иметь пульт управления для своего «путешествия» по данным.

Расширяем возможности: enumerate и zip

Python постоянно подкидывает удобные инструменты, и enumerate и zip — отличные тому примеры. Они делают ваш код чище и понятнее, когда нужно сделать что-то чуть сложнее, чем просто перебрать элементы.

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

`zip()` — а вот это просто супер-удобно, когда у вас есть несколько списков (или других последовательностей), и вам нужно пройтись по ним одновременно, беря по элементу из каждого. Например, у вас есть список имен и список возрастов, и вы хотите сопоставить каждого человека с его возрастом. zip() объединяет эти списки в пары.

Давайте посмотрим на примерах, как это работает:


# Пример с enumerate
фрукты = ["яблоко", "банан", "вишня"]
for индекс, фрукт in enumerate(фрукты):
    print(f"Элемент под номером {индекс}: {фрукт}")
# Вывод:
# Элемент под номером 0: яблоко
# Элемент под номером 1: банан
# Элемент под номером 2: вишня

# Пример с zip
имена = ["Алиса", "Боб", "Чарли"]
возрасты = [25, 30, 22]
for имя, возраст in zip(имена, возрасты):
    print(f"{имя} - {возраст} лет")
# Вывод:
# Алиса - 25 лет
# Боб - 30 лет
# Чарли - 22 лет

 

enumerate и zip — это те инструменты, которые реально экономят время и делают код более «питоничным». Они позволяют вам сосредоточиться на логике, а не на механике перебора. Так что, если вы увидите их в коде или будете писать свой, знайте — это хороший тон. Прям очень хороший.

Используйте их чаще, и вы заметите, как ваш код станет более кратким и читаемым. Это как научиться жонглировать — сначала сложно, а потом становится легко и даже приятно.

Вложенные циклы и генераторы

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

Например, чтобы пройтись по всем элементам матрицы, вы сначала проходите по каждому «строку» (внешний цикл), а внутри каждой строки проходите по каждому «элементу» (внутренний цикл).

Другая мощная штука — это генераторы списков (list comprehensions). Это такой компактный и элегантный способ создавать списки. Вместо того чтобы писать цикл for с добавлением элементов в пустой список, вы можете сделать это в одну строку. Выглядит это примерно так: [выражение for элемент in итерируемый_объект if условие].

Давайте посмотрим на примерах:


# Вложенные циклы для матрицы
матрица = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

print("Элементы матрицы:")
for строка in матрица: # Внешний цикл
    for элемент in строка: # Внутренний цикл
        print(элемент, end=" ")
# Вывод: 1 2 3 4 5 6 7 8 9 

# Генератор списка для получения квадратов чисел
числа = [1, 2, 3, 4, 5]
квадраты = [x**2 for x in числа]
print(f"\nКвадраты чисел: {квадраты}")
# Вывод: Квадраты чисел: [1, 4, 9, 16, 25]

# Генератор списка с условием
четные_квадраты = [x**2 for x in числа if x % 2 == 0]
print(f"Квадраты четных чисел: {четные_квадраты}")
# Вывод: Квадраты четных чисел: [4, 16]

 

Генераторы списков — это не просто сокращение кода, они часто работают быстрее, чем обычные циклы с append(). Плюс, они делают код более декларативным, то есть вы описываете, ЧТО хотите получить, а не как именно это сделать шаг за шагом.

Так что, если видите вложенные циклы — не пугайтесь, это просто более глубокое погружение. А генераторы списков — осваивайте, они реально крутые и делают код намного изящнее!

Типичные ошибки и как их избежать

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

Вот несколько самых частых граблей:

  • Изменение списка во время итерации: Это, пожалуй, самая коварная ошибка. Если вы пытаетесь удалить или добавить элементы в список, по которому сейчас идет цикл for, поведение программы становится непредсказуемым. Python может пропустить элементы или выдать ошибку. Лучший способ обойти это — создавать новый список с нужными изменениями, а не мучить старый.
  • Неправильное использование `range()`: Забыли про то, что stop — это не включительно, или перепутали порядок аргументов start, stop, step. Внимательность — наше всё!
  • Проблемы с отступами: Мы уже говорили, но повторимся — отступы критически важны. Одна лишняя или недостающая табуляция — и всё, ошибка.
  • Бесконечный цикл (хотя для for это редкость): Чаще встречается с while, но теоретически, если ваш «итерируемый объект» ведет себя очень странно, можно нарваться.

Чтобы избежать всего этого, просто следуйте нескольким простым правилам:

  1. Если нужно изменить список, создайте новый.
  2. Дважды проверьте аргументы range(), если используете его.
  3. Следите за отступами, как за зеницей ока.
  4. Перед запуском критически важных циклов, протестируйте их на небольших наборах данных.

Эти простые советы помогут вам избежать массы головной боли и сделать ваш код с циклами for по-настоящему надежным. И помните, отладка — это не признак неудачи, это часть процесса обучения и написания качественного кода!

Твои коллеги будут рады, поделись в

Автор урока

Дмитрий Комаровский
Дмитрий Комаровский

Автоматизация процессов
в КраснодарБанки.ру

Другие уроки курса "Python"

  1. Работа со словарями в Python
  2. Проверка переменных окружения в Python
  3. Транспонирование 2D-массива с помощью zip
  4. Аннотации типов в Python
  5. Имена объектов в Python
  6. Работа со строками в Python
  7. Удаление элемента по индексу
  8. Метод rmatmul для пользовательских матриц
  9. Получение размера объекта с sys.getsizeof()
  10. Методы split() и join() — Python строк.
  11. Принципы программирования
  12. Объединение списков с помощью zip
  13. Тестирование модели в PyTorch
  14. Логирование с Logzero
  15. Исправление ошибки NameError
  16. Создание вложенных циклов for
  17. Python Метод del.
  18. Транспонирование матрицы в Python
  19. Метод ipow для возведения в степень
  20. Удаление URL-адресов в Python
  21. Многострочные комментарии в Python
  22. Функции all и any в Python
  23. Использование defaultdict в Python
  24. Оптимизация гиперпараметров с Scikit Optimize
  25. Работа со словарями Python
  26. Итераторы в Python
  27. Оператор @ для умножения матриц
  28. Регулярные выражения: метод match
  29. Аннотации типов в Python
  30. Создание новых функций с помощью functools.partial
  31. Обратное распространение ошибки
  32. Работа с Event() в threading
  33. Метод __int__ в Python
  34. Объединение словарей в Python
  35. Очистка данных в Python
  36. Множества и frozenset
  37. Создание генераторов в Python
  38. Структурирование именованных констант
  39. Функция reduce() из модуля functools
  40. Расширение информации об ошибке в Python
  41. Декораторы в Python
  42. Инверсия списков и строк в Python
  43. Создание GUI с Tkinter: Entry
  44. Объединение множеств в Python
  45. Форматирование строк в Python
  46. Функция rsplit() в Python
  47. Операции с кортежами
  48. Создание панели меню Tkinter
  49. Функции высшего порядка в Python

Marketello читают маркетологи из крутых компаний