Python: Цикл For
С помощью цикла while решают любую задачу перебора элементов, но его отличает многословность. Для while нужно задавать условие остановки и вводить счетчик. Когда циклов немного, то это нормально, но в реальном коде циклы встречаются на каждом шагу. Поэтому управлять условиями вручную утомительно, особенно когда условие остановки очевидно.
Например, если мы хотим перебрать символы в строке, то компьютер сам может понять, когда строка заканчивается. Для таких ситуаций в Python ввели цикл for . Он сам знает, когда нужно остановиться, так как работает только с коллекциями — наборами элементов, которые нужно перебрать.
Строка — это коллекция, так как состоит из набора символов. Остальные виды коллекций подробно изучаются в другом курсе.
text = 'code' for symbol in text: print(symbol) # => c # => o # => d # => e
В коде выше for проходит по каждому символу в строке, записывает его в переменную symbol и вызывает внутренний блок кода, где эта переменная используется. Имя этой переменной может быть любым. Общая структура цикла for выглядит так: for in .
Посмотрим, как реализовать функцию переворота строки через цикл for :
def reverse_string(text): # Начальное значение result = '' # char - переменная, в которую записывается текущий символ for char in text: # Соединяем в обратном порядке result = char + result # Цикл заканчивается, когда пройдена вся строка return result reverse_string('go!') # => '!og'
Разберем подробно как отрабатывает цикл в примере выше на каждом шаге итераций:
- В первой итерации в цикле result равен пустой строке, char равен первому символу ‘g’. Поэтому в result присваивается символ ‘g’ плюс пустая строка, в итоге сохраняется только символ ‘g’
- На второй итерации result уже хранит символ ‘g’, а char равен следующему символу ‘o’. В result записывается char + result , то есть ‘o’ + ‘g’
- На последней итерации в result хранится строка ‘og’, а char равен последнему символу ‘!’. В result теперь сохраняется ‘og’ + ‘!’
Теперь посчитаем количество упоминаний символа в строке без учета регистра:
# text - произвольный текст # char - символ, который нужно учитывать def chars_count(text, char): # Так как ищем сумму, то начальное значение 0 result = 0 for current_char in text: # приводим все к нижнему регистру, # чтобы не зависеть от текущего регистра if current_char.lower() == char.lower(): result += 1 return result chars_count('hexlet!', 'e') # 2 chars_count('hExlet!', 'e') # 2 chars_count('hExlet!', 'E') # 2 chars_count('hexlet!', 'a') # 0
Советуем поэкспериментировать с примерами выше в интерактивном Replit.
Задание
В одном из предыдущих уроков мы уже написали функцию filter_string() . Напомним, она принимает на вход строку и символ и возвращает новую строку, в которой удалён переданный символ во всех его позициях. На этот раз реализуйте эту функцию с помощью цикла for . Дополнительное условие: регистр исключаемого символа не имеет значения.
text = 'If I look forward I win' filter_string(text, 'i') # 'f look forward wn' filter_string(text, 'O') # 'If I lk frward I win'
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Определения
- Агрегация — Накопление результата во время итераций и работа с ним после цикла.
Как работает цикл for в Python
Цикл for используют, когда количество повторов известно заранее.

Анастасия Хамидулина
Автор статьи
14 апреля 2022 в 17:57
В быту нам часто приходится выполнять повторяющиеся действия. Например, чтобы повесить постиранное белье, нужно доставать и развешивать каждую вещь. В программировании такие повторяющиеся задачи упрощают. Чтобы писать один и тот же код снова и снова, используют циклы.
Итерации
Итерация — это повтор какого-либо действия. То есть один шаг цикла. Например, цикл из пяти повторений — пять итераций.
Итератор — это интерфейс, который позволяет получить следующий объект последовательности.
Итерируемые объекты — это объекты, которые можно повторять.
В Python проводят итерации только по тем объектам, которые реализуют интерфейс итератора. Это значит, что объект должен переопределять и реализовывать методы __iter__ и __next__.
Метод __iter__ возвращает self — ссылку на экземпляр. С помощью __next__ получают следующий элемент последовательности.

Схема работы цикла for
Непрофессионалу сложно разобраться в этих значениях. Но если нравится программирование и хотите его изучать, приходите на курс «Python-разработчик». Вы не только поймете все тонкости работы, но и выполните типовые проекты разработчика, добавите их в портфолио и получите диплом установленного образца. А еще вас ждут консультации центра карьеры, которые помогут быстро найти хорошее место работы.
Виды циклов
В Python есть два вида циклов: for и while.
Цикл for позволяет проводить итерации — реализовывать набор инструкций нужное количество раз. Его используют, когда количество итераций известно заранее, поэтому второе название цикла — c предусловием.
Цикл while — выполнять инструкции до тех пор, пока проверка во главе цикла будет истинной. Его используют, когда заранее не знают количества итераций, поэтому еще его называют циклом с проверкой условия.
int i = 0 while i < 10: print(“Hello, World!”) i++
Синтаксис цикла for
Он выглядит так:
Как работать с циклом for в Python
https://sky.pro/media/knigi-pro-python/
Цикл for работает со встроенными типами данных. Например, строки, списки, множества, кортежи, словари и даже файлы.
Всему этому научитесь на первом модуле курса «Python-разработчик». И даже примените новые знания при создании программы, которая позволит расшифровать азбуку Морзе.
По списку
Чтобы вывести на экран все элементы списка, напишите код:
# список elems = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # итерация по списку for item in elems: print(item) . 0 1 2 3 4 5 6 7 8 9
Такого же результата можно добиться с помощью функции range, которая генерирует последовательность чисел.
# итерация по числам с нуля до 10 не включительно for i in range(0, 10): print(i) . 0 1 2 3 4 5 6 7 8 9
С шагом
Если нужно отобразить каждое второе число из списка, сделайте проверку на деление с остатком. Алгоритм:
получаем размерность множества;
↓
отнимаем от этого числа единицу;
↓
итерируемся по множеству чисел с нуля до полученного числа включительно;
↓
получаем элементы списка, используя индексацию.

Python для начинающих аналитиков | Урок 2 | Цикл For in, list, метод Split(), tuple
Каждый шаг цикла делим индекс на 2 с остатком. Если остатка не будет, выводим число на печать. Вот так:
# кортеж elems = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) # получаем размерность length = len(elems) # нам не нужно отнимать единицу, так как # крайнее число в range не входит в последовательность # первое число тоже не указываем # по умолчанию — оно равно нулю for i in range(length): # если остатка нет — выводим число if i % 2 == 0: print(elems[i]) . 0 2 4 6 8
Этот же пример можно выполнить с помощью функции enumerate. На каждой итерации эта функция возвращает индекс элемента и его значение.
# множество elems = # применяется распаковка кортежа вида (индекс, элемент) for index, elem in enumerate(elems): if index % 2 == 0: print(elem) . 0 2 4 6 8
Так это делают с помощью шага в функции range:
# каждое второе число от 0 до 10 for i in range(0, 10, 2): print(i) . 0 2 4 6 8
Если необходимо прервать цикл, например когда ожидали символ, а получили число, используйте инструкцию break.
for chr in "The t3st string" if chr.isdigit(): break print(chr) . T h e t
# дальше вывод не пойдет, так как слово t3st написано через тройку
Перейти на следующий шаг цикла можно с помощью инструкции continue.
for i in range(10): if i % 3 == 0: continue print(i) . 1 2 4 5 7 8
По строке
Иногда в алгоритмах нужно применять альтернативные инструкции для объектов, которые не проходят проверку. Выведем на печать каждый символ строки, меняя нижний регистр на верхний:
for chr in "THis is THe TEst sTRinG": if chr.islower(): print(chr.upper()) else: print(chr) . T H I S I S T H E T E S T S T R I N G
Если вы хотите прочитать каждую строку файла:
with open('file.txt', 'r') as f: for line in f: print(line)
По словарю
Итерацию по словарю проводят тремя способами. Первый и второй способ дают очередной ключ и очередное значение словаря на каждом шаге. Третий — и ключ, и значение за один шаг.
mydict =
# итерация по ключам for key in mydict: print(f" :: ")
# вывод вида . 1 :: one 2 :: two 3 :: three 4 :: four 5 :: five
# по ключам с явным указанием for key in mydict.keys(): print(f" :: ")
# вывод вида . 1 :: one 2 :: two 3 :: three 4 :: four 5 :: five
# итерация по значениям for value in mydict.values(): print(value) . one two three four five
# итерация по ключам и значениям # применяется распаковка кортежа вида (ключ, значение) for key, value in mydict.items(): print(key, value) . 1 one 2 two 3 three 4 four 5 five
Обратный цикл
Встроенная функция reversed и слайсинги позволяют проводить итерацию по объекту в обратном порядке.
elems = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# пример for item in reversed(elems): print(item) . 9 8 7 6 5 4 3 2 1 0
# пример использования слайсингов for item in elems[::-1]: print(item) . 9 8 7 6 5 4 3 2 1 0
Генератор
Инструкция for есть в различных выражениях-генераторах, например генераторе списка или словаря.
Разобраться во всех тонкостях языка проще на курсе «Python-разработчик». Вам помогут опытные преподаватели и наставники, вы попрактикуетесь, составите сильное портфолио и резюме, а еще получите диплом установленного образца.
# так мы сделаем список из 20 случайно сгенерированных чисел mylist = [random.randint(0, 11) for _ in range(20)]
Как работает цикл for в Python

В этой статье мы разберем, работу цикла for в Python.
Мы начнем с пары основных примеров и их синтаксиса. Далее обсудим, когда может быть полезен блок else, связанный с циклом for. Затем мы разберем итерактивные объекты (iterable), итераторы (iterator) и протокол итератора. Также узнаем, как создавать собственные итераторы и итерируемые объекты. После этого мы обсудим, как цикл for реализован с использованием итерактивных объектов и итераторов. Потом мы рассмотрим реализацию логики цикла for, используя цикл while и используя протокол итератора.
И наконец, для тех, кому интересно, мы разберем простой цикл for и пройдемся по инструкциям, которые интерпретатор Python выполняет при выполнении цикла for. Это должно помочь понять, что именно происходит внутри, во время работы цикла for.
Цикл for в Python
Оператор for является одним из двух операторов, используемых для создания циклов в Python, другим является оператор while. Если вы совсем не знакомы с итерациями в Python, то рекомендуем почитать статью Итерации в Python: операторы for, while, break и continue которая будет хорошей отправной точкой для изучения циклов и итераций.
Простой цикл for
Давайте начнем с простого цикла for, который перебирает список строк и печатает каждую строку.
>>> for word in ["You", "are", "awesome!"]: . print(word) . You are awesome!
Как видите, цикл перебирает все слова в списке и печатает их. То есть на каждом шаге цикла переменной word присваивается элемент списка, а затем выполняется кодовый блок. Поскольку список – это упорядоченная последовательность элементов, цикл проходит по ним в том же порядке.
Цикл for с условием else
В Python цикл for может иметь необязательное условие else. Кодовый блок в предложении else выполняется после завершения цикла for, то есть после того, как все элементы итерируемого элемента были исчерпаны. Теперь давайте посмотрим, как мы можем расширить предыдущий пример, чтобы включить условие else.
>>> for word in ["You", "are", "awesome!"]: . print(word) . else: . print("See you later!") . You are awesome! See you later!
Когда полезно условие else?
Как вы могли заметить, блок else выполняется после завершения цикла for. Так какой смысл использовать блок else? Разве не будет выполнен следующий набор операторов после цикла for?
Ну, во многих случаях у нас возникают ситуации, когда нам нужно выйти из цикла for, когда выполняется определенное условие. И если это условие никогда не выполняется, но нам все равно нужно выполнить набор операторов. Для этого мы обычно используем логический флаг. Давайте посмотрим на пример.
def search(search_list, search_item): found_item = False for word in search_list: if word == search_item: found_item = True print("Found word '<>'".format(search_item)) break if not found_item: print("Word '<>' was not found!".format(search_item))
>>> search(["You", "are", "awesome!"], "are") Found word 'are' >>> search(["You", "are", "awesome!"], "we") Word 'we' was not found!
С помощью блока else мы можем избежать использования логического флага found_item. Давайте посмотрим, как мы можем переписать вышеуказанный метод с помощью else. Обратите внимание, что блок else будет пропущен, если в цикле for встречается оператор break.
def search(search_list, search_item): for word in search_list: if word == search_item: print("Found word '<>'".format(search_item)) break else: print("Word '<>' was not found!".format(search_item))
Таким образом, блок else действительно полезен, только если у нас есть оператор break в цикле for, и нам нужно, чтобы выполнился набор операторов, если условие break никогда не выполнялось.
В противном случае операторы, связанные с else, просто выполняются в конце цикла for. Вы увидите это, когда мы разберем байт-код в последнем разделе этой статьи.
Синтаксис цикла for
Теперь, когда мы рассмотрели несколько основных примеров, давайте завершим этот раздел синтаксисом цикла for.
for in : else:
По сути, для каждого итерируемого элемента выполняется set_of_statements_1. Как только все элементы исчерпаны, управление переходит к блоку else и выполняется set_of_statements_2.
Обратите внимание, что предложение else является необязательным. Если блок else отсутствует, цикл завершается после того, как все элементы будут пройдены, и управление переходит к следующему оператору программы.
Итерируемые объекты (iterables) и итераторы (iterators)
Итерируемые объекты
В предыдущем разделе мы использовали термин «iterables» для обозначения объекта, который итерировался циклом for. Теперь давайте попробуем понять, что такое итерируемый объект в Python.
В Python итерируемый объект – это любой объект, который можно использовать в итерации с использованием цикла for. Это означает, что объект должен возвращать итератор при передаче в метод iter(). Давайте посмотрим примеры некоторых часто используемых встроенных итерируемых объектов в Python.
>>> iter(«You are awesome!») # String >>> iter([«You», «are», «awesome!»]) # List >>> iter((«You», «are», «awesome!»)) # Tuple >>> iter() # Set >>> iter() # Dictionary >>> iter(range(3)) # Range function
Как вы можете видеть, когда мы вызываем iter() для итерируемого объекта, он возвращает объект итератора.
Итераторы
А что такое итератор? В Python итератор определяется как объект, представляющий поток данных. По сути, если мы передаем итератор во встроенный метод next(), он должен вернуть следующее значение из связанного потока данных. Когда все элементы исчерпаны, должно появиться исключение StopIteration. Он должен продолжать вызывать исключение StopIteration для любых последующих вызовов метода next().
Примеры итератора со списком.
>>> my_list = ["You", "are", "awesome!"] >>> >>> # Get the iterator. . list_iterator = iter(my_list) >>> >>> # Get next element of iterator. . next(list_iterator) 'You' >>> next(list_iterator) 'are' >>> next(list_iterator) 'awesome!' >>> next(list_iterator) Traceback (most recent call last): File "", line 1, in StopIteration >>> next(list_iterator) Traceback (most recent call last): File "", line 1, in StopIteration
Итераторы тоже итеративные объекты! Но..
Следует помнить одну интересную вещь: итераторы сами по себе также поддерживают (обязаны поддерживать согласно протоколу итератора) метод iter(). Это означает, что мы можем вызвать метод iter() для итератора и получить сам объект итератора.
>>> my_list = [«You», «are», «awesome!»] >>> list_iterator = iter(my_list) >>> list_iterator >>> iterator_of_iterator = iter(list_iterator) >>> iterator_of_iterator
Таким образом, мы можем использовать итераторы везде, где ожидается итерация, например, в цикле for.
Однако обратите внимание, что вызов iter() для объекта-контейнера, такого как list, каждый раз будет возвращать новый итератор. Но вызов iter() для итератора просто возвращает тот же объект.
>>> my_list = [1, 2] >>> iter(my_list) >>> iter(my_list) # This gives a fresh iterator object
>>> my_list = [1, 2] >>> list_iter = iter(my_list) >>> list_iter >>> iter(list_iter) # This returns the same iterator object >>> iter(list_iter) # This returns the same iterator object
Итерация по списку дважды
Обратите внимание, что это работает так, как мы ожидали.
>>> my_list = ["You are Awesome!"] >>> >>> for word in my_list: . print(word) . You are Awesome! >>> for word in my_list: . print(word) . You are Awesome!
Итерация через list_iterator дважды
Обратите внимание, что итератор будет исчерпан в первом цикле, а во второй раз мы просто видим пустой контейнер.
>>> my_list = ["You are Awesome!"] >>> list_iterator = iter(my_list) >>> >>> for word in list_iterator: . print(word) . You are Awesome! >>> >>> for word in list_iterator: . print(word) . >>>
Протокол итератора
В предыдущем разделе мы увидели, что:
- Итерируемый объект при передаче в функцию iter() возвращает итератор.
- Итератор,
- при передаче в функцию next() возвращает следующий элемент или вызывает StopIteration после того, как все элементы будут исчерпаны.
- при передаче функции iter() возвращает себя.
Протокол итератора – это не что иное, как стандартный способ определения объектов как итераторов. Мы уже видели протокол в действии в предыдущем разделе. Согласно протоколу, итераторы должны определить следующие два метода:
- __next()__
- Этот метод должен возвращать следующий элемент серии каждый раз, когда он вызывается. Как только все элементы исчерпаны, должно появиться исключение StopIteration.
- Этот метод вызывается изнутри, когда мы вызываем встроенный метод next().
- __iter()__
- Этот метод должен возвращать сам объект итератора.
- Это метод, который вызывается внутри, когда мы вызываем встроенный метод iter().
Создание своего собственного итератора
Теперь, когда мы рассмотрели, как работает протокол итераторов, мы можем создавать свой собственный итератор. Давайте посмотрим на простой пример, где мы создаем наш собственный класс Range, который генерирует числа в данном диапазоне с заданным шагом.
class Range: def __init__(self, start, stop, step): self.next = start self.stop = stop self.step = step def __next__(self): if self.next > self.stop: raise StopIteration next_item = self.next self.next += self.step return next_item def __iter__(self): return self
Теперь посмотрим, как он работает с циклом for.
>>> for num in Range(1, 10, 2): . print(num) . 1 3 5 7 9
Обратите внимание, что экземпляр Range является как итерируемым объектом, так и итератором.
Создание своего собственного итерируемого объекта
Все, что для этого нужно, это возвращать новый итератор всякий раз, когда вызывается метод __iter__() , т. е. в этом случае он должен возвращать новый экземпляр Range.
class RangeIterable: def __init__(self, start, stop, step): self.start = start self.stop = stop self.step = step def __iter__(self): return Range(self.start, self.stop, self.step)
Давайте теперь используем наш RangeIterable с циклом for.
>>> for num in RangeIterable(1, 10, 2): . print(num) . 1 3 5 7 9
Как работает цикл for?
Теперь, когда мы поняли, что такое итератор и итерируемый объект, мы можем глубже понять, как на самом деле работает цикл for.
Давайте снова посмотрим на наш предыдущий пример.
>>> for word in ["You", "are", "awesome!"]: . print(word) . else: . print("See you later!") . You are awesome! See you later!Когда мы выполняем вышеуказанный блок кода, происходит следующее:
- Оператор for внутри себя вызывает iter() для списка [«You», «are», «awesome!»]. Это приводит к получению итератора.
- Затем вызывается next() для итератора, и возвращаемое им значение присваивается переменной цикла, в данном случае word.
- После этого выполняется блок оператора, связанный с циклом for. В этом случае print(word).
- Шаги 2 и 3 повторяются до тех пор, пока next() не вызовет StopIteration.
- Как только next() вызывает StopIteration, управление переходит к предложению else, если оно присутствует, и выполняется блок операторов, связанных с else.
Примечание. Если в блоке кода, связанном с циклом for, встречается оператор break, то блок else пропускается.
Реализация логики цикла for с помощью оператора while
Мы могли бы реализовать вышеуказанную логику, используя оператор while следующим образом.
my_list = ["You", "are", "awesome!"] list_iter = iter(my_list) while True: try: word = next(list_iter) print(word) except StopIteration: print("See you later!") breakЦикл while ведет себя точно так же, как наш цикл for, и выдает следующий результат.
You are awesome! See you later!
Разбор цикла for
В этом разделе мы разберем цикл for и пройдемся по инструкциям, которые интерпретатор исполняет при выполнении цикла for. Мы будем использовать модуль dis для разборки цикла for. Чтобы быть точным, мы будем использовать метод dis.dis, чтобы получить удобочитаемое представление дизассемблированного байт-кода.
Мы будем использовать тот же простой цикл for, который мы рассматривали до сих пор. Запишем следующий цикл for в файл for_loop.py.
for word in ["You", "are", "awesome!"]: print(word) else: print("See you later!")Теперь мы можем получить читаемую форму байт-кода, вызвав dis.dismethod. Запустим следующую команду в терминале.
$ python3 -m dis for_loop.py 1 0 SETUP_LOOP 28 (to 30) 2 LOAD_CONST 0 (('You', 'are', 'awesome!')) 4 GET_ITER >> 6 FOR_ITER 12 (to 20) 8 STORE_NAME 0 (word) 2 10 LOAD_NAME 1 (print) 12 LOAD_NAME 0 (word) 14 CALL_FUNCTION 1 16 POP_TOP 18 JUMP_ABSOLUTE 6 >> 20 POP_BLOCK 4 22 LOAD_NAME 1 (print) 24 LOAD_CONST 1 ('See you later!') 26 CALL_FUNCTION 1 28 POP_TOP >> 30 LOAD_CONST 2 (None) 32 RETURN_VALUEКаждый из столбцов в разобранном виде представляет следующее:
- Колонка 1: номер строки кода.
- Колонка 2: знак «>>», если инструкция является целью перехода.
- Колонка 3: смещение байт кода в байтах.
- Колонка 4: инструкция байт-кода.
- Колонка 5: аргументы инструкции. В скобках отображается более понятный для человека имя аргументов.
Теперь давайте шаг за шагом пройдемся по нашему разобранному байт-коду и попытаемся понять, что на самом деле происходит.
В этом описание термин TOS означает вершина стека (top of the stack)- строка 1, “for word in [“You”, “are”, “awesome!”]:” переводится как:
- 0 SETUP_LOOP 28 (to 30)
- Этот оператор помещает блок для цикла for в стек. Блок занимает от этой инструкции до 28 байт, то есть до «30»
- Это означает, что если в цикле for есть оператор break, управление переместится на «30» байт. Обратите внимание, блок else, будет пропущен если встретится оператор break.
- 2 LOAD_CONST 0 ((‘You’, ‘are’, ‘awesome!’))
- Затем список помещается на вершину стека (TOS).
- 4 GET_ITER
- Эта инструкция выполняет «TOS = iter (TOS)». Это означает, что итератор получается из списка, который на данный момент является TOS, а затем итератор переносится в TOS.
- 6 FOR_ITER 12 (to 20)
- Эта инструкция получает TOS, который на данный момент является нашим итератором, и вызывает для него метод next().
- Если next() возвращает значение, оно помещается в стек, и будет выполнена следующая инструкция «8 STORE_NAME».
- Как только функция next() указывает, что итератор исчерпан (т. к. сработал StopItered), TOS (а именно итератор) будет извлечен из стека, а счетчик байтового кода будет увеличен на 12. Это означает, что элемент управления перейдет к инструкция «20 POP_BLOCK».
- 8 STORE_NAME 0 (word)
- Эта инструкция преобразуется в word = TOS, то есть значение, возвращаемое функцией next(), будет присвоено переменной word.
- 0 SETUP_LOOP 28 (to 30)
- строка 2, “print(word)” переводится как:
- 10 LOAD_NAME 1 (print)
- Эта команда помещает команду print в стек.
- 12 LOAD_NAME 0 (word)
- Это команда перемещает аргумент print, то есть word в стек.
- 14 CALL_FUNCTION 1
- Это команда вызывает функцию с позиционными аргументами.
- Аргументы, связанные с функцией, будут присутствовать в TOS, как мы видели в предыдущей инструкции. Все аргументы выталкиваются до тех пор, пока не получит вызываемый объект, то есть print.
- Как только он получает вызываемый объект, он вызывается путем передачи ему всех аргументов.
- Как только вызов выполнен, его возвращаемое значение будет передано в TOS. В текущий момент это будет None.
- 16 POP_TOP
- TOS, то есть возвращаемое значение из функции удаляется (выталкивается) из стека.
- 18 JUMP_ABSOLUTE 6
- Счетчик байт-кода теперь установлен на «6». Это означает, что следующая выполняемая инструкция будет «6 FOR_ITER». Вот так цикл проходит по элементам итератора.
- Обратите внимание, что инструкция «6 FOR_ITER» заставит программу выйти из этого цикла и перейти к «20 POP_BLOCK», как только все элементы итератора будут исчерпаны.
- 20 POP_BLOCK
- POP_BLOCK приведет к удалению блока, установленного в «0 SETUP_LOOP», из стека блоков.
- 10 LOAD_NAME 1 (print)
- Обратите внимание, что номер строки 3, т.е., else, не имеет каких-либо конкретных инструкций, связанных с этим. Управление программой естественным образом переходит к следующей инструкции, которая в основном состоит из операторов, связанных с else.
- строка 4, “print(“See you later!”)” переводится как:
- 22 LOAD_NAME 1 (print)
- Вызываемый объект, связанный с print, помещается в стек.
- 24 LOAD_CONST 1 (‘See you later!’)
- Аргументы для вызываемого объекта помещаются в стек.
- 26 CALL_FUNCTION 1
- Аргументы для print и команда print извлекаются из стека. Затем выполняется вызываемая функция, и ее возвращаемое значение передается в TOS.
- 28 POP_TOP
- TOS, то есть возвращаемое значение функции (в данном случае None) удаляется из стека.
- 22 LOAD_NAME 1 (print)
- Следующие две инструкции в основном загружают возвращаемое значение нашего скрипта (None) в стек и возвращают его.
- 30 LOAD_CONST 2 (None)
- 32 RETURN_VALUE
Вув! Итак, мы закончили с разборкой инструкций для цикла for. Я надеюсь, что это поможет немного лучше понять работу цикла for.
Заключение
В этом посте мы рассмотрели следующее:
- Как написать цикл for в Python?
- Как использовать else, связанное с циклом for?
- Что такое итераторы и итерируемые объекты?
- Что такое протокол итератора?
- Как создать итератор и итерируемый объект?
- Как работает цикл for?
- Как используя цикл while имитировать цикл for?
- Как разобрать цикл for с помощью модуля dis и увидеть понятные человеку инструкции, выполняемые интерпретатором Python? Как читать и понимать разобранные инструкции?
Как работает оператор цикла for python

Простейший пример такого цикла:
>>> for i in range(5): print('Python') Python Python Python Python PythonДругой пример простого цикла – перебор элементов какой-либо коллекции:
for название_переменной in название_коллекции: тело циклаКод и результат работы подобного цикла выглядят так:
>>> for i in 'Python': print(i) P y t h o nПервая строка, открывающая цикл for , завершается двоеточием : . Такие двоеточия используются во многих конструкциях Python, не только в for , и каждый раз, обнаруживая : , интерпретатор будет ожидать индентацию (отступ) на следующей строке. Отступы в Python разделяют код на логические блоки (в других языках такое разделение происходит с помощью иных знаков – фигурных скобок, точки с запятой). В соответствии с руководством PEP8 , отступ может состоять либо из 4 пробелов, либо из одного символа табуляции Tab. Индентация пробелами – предпочтительна, табами – допустима. Однако недопустимо смешивать пробелы и табуляцию – это сразу же приведет к ошибке:
TabError: inconsistent use of tabs and spaces in indentationНедостаток или избыток пробелов также приводят к ошибке, поскольку не дают интерпретатору определить, к какому именно логическому блоку относится фрагмент кода:
IndentationError: unindent does not match any outer indentation levelСтруктура вложенного цикла for
Любой цикл for может включать в себя другой for-цикл (или даже несколько):
lst1 = ['1', '2', '3', '4', '5'] lst2 = ['a', 'b', 'c', 'd', 'e'] for i in lst1: for j in lst2: print(i + j)Во время выполнения вложенного цикла Python сначала перебирает все элементы внутреннего цикла, а затем переходит к следующему элементу внешнего цикла:
1a 1b 1c 1d 1e 2a 2b 2c 2d 2e 3a 3b 3c 3d 3e 4a 4b 4c 4d 4e 5a 5b 5c 5d 5eСтруктура цикла for с условием
Для проверки соответствия переменных (элементов) каким-либо условиям в Python используется конструкция вида if… elif… else… :
age = int(input('Сколько тебе лет? ')) if age < 7: print('В какой детсад ходишь?') elif 7 90: print('Долгожитель!') else: print('Где работаешь?')Разумеется, при решении более простых задач условие может выглядеть гораздо проще:
st = 'abracad5bra' for i in st: if not i.isalpha(): print(i)Структура цикла for с прерыванием break и пропуском continue
Иногда цикл нужно завершить досрочно в связи с обнаружением какого-либо значения или события. В этом случае используют оператор break :
st = '32ey.5yhsf$h%owe82038e-3q0dwaefsfdgfhyfWfd9fG' for i in st: if i.isdigit() and int(i) > 8: breakВыполнение этого кода прервется, как только интерпретатор дойдет до цифры 9 в строке st .
Помимо прерывания цикла, часто возникает необходимость не совершать операцию (или набор действий) для определенного элемента. Для этого используют оператор continue , который переходит к следующей итерации при обнаружении элемента, который не следует обрабатывать:
st = 'м.у$т^а>б(о@р' for i in st: if not i.isalpha(): continue else: print(i)Этот код пропускает все символы, которые не являются буквами. Результат:
м у т а б о рВвод и вывод данных с помощью цикла for в Питоне
Цикл for часто используют для ввода данных. Например, так можно ввести вложенный список (матрицу) из n строк:
n = int(input()) lst = [] for i in range(n): lst.append(list(map(int, input().split())))А так матрицу можно вывести:
# 1-й способ вывода for i in lst: print(*i) # 2-й способ вывода for i in range(len(lst)): for j in range(len(lst)): print(lst[i][j], end=' ') print() print()Результат вывода матрицы из 5 строк:
1 2 3 4 7 7 8 3 9 0 1 3 9 5 3 2 7 4 9 2 1 9 0 4 5Особенности цикла for в Python
1. В цикле for может быть более одной переменной. Например, так можно вывести на экран элементы словаря:
>>> my_dict = >>> for k, v in my_dict.items(): print(f' - ') цвет - красный артикул - ABC123 цена - 6502. Если переменная не используется в теле цикла, вместо названия можно указывать символ подчеркивания _ :
>>> mydict = <> >>> for _ in range(int(input())): k, v = input().split(': ') mydict[k.capitalize()] = v.title() 3 жанр: ужасы, триллер название: "мизери" автор: стивен кинг >>> print(mydict)3. В цикле for можно использовать дополнительные параметры функции range() – старт и шаг :
>>> for i in range(1, 12, 2): print('*' * i) * *** ***** ******* ********* ***********4. Для проверки множества условий в цикле for очень удобно использовать словарь:
ops = a, b = int(input('Введите значение a: ')), int(input('Введите значение b: ')) op = input('Введите знак операции: ') if op in ops.keys(): print(eval(ops[op])) else: print('Поддерживаются операции +, -, * и /')Без словаря код выглядел бы так:
a, b = int(input('Введите значение a: ')), int(input('Введите значение b: ')) op = input('Введите знак операции: ') if op == '-': print(a - b) elif op == '+': print(a + b) elif op == '/': print(a / b) elif op == '*': print(a * b) else: print('Поддерживаются операции +, -, * и /')5. Несмотря на то, что во многих случаях цикл for – простой, вложенный, с условиями – можно заменить генератором или списковым включением, обычный цикл читается легче – сравните эти примеры:
my_dict =
Обычный цикл for:
for _ in range(int(input())): k, v = input().split(': ') my_dict[k.lower()] = vКроме того, решение многих задач с помощью циклов выглядит более понятным и интуитивным – сравните цикл и генератор для вычисления ряда Фибоначчи:
Цикл + кортежи:
f1, f2 = 1, 1 for i in range(int(input())): print(f1) f1, f2 = f2, f1 + f2Генератор Фибоначчи:
fib = [1, 1] calc = [fib.append(fib[i - 1] + fib[i - 2]) for i in range(2, int(input()))] print(*fib)6. Вложенные циклы делают код для ввода и вывода матриц (вложенных списков) довольно объемным. Предположим, что нужно написать программу для ввода и вывода матрицы n x m. При n = 4 и m = 3 результат вывода выглядит так:
2 5 6 1 7 8 9 0 3 4 7 5Сравним код ввода и вывода, написанный с применением вложенных циклов и код, реализованный с помощью генератора:
Вложенные циклы:
n, m = int(input()), int(input()) matrix = [] for i in range(n): matrix.append([]) for j in range(m): temp = input() matrix[i].append(temp) for i in range(n): for j in range(m): print(matrix[i][j], end=' ') print()n, m = int(input()), int(input()) matrix = [[input() for word in range(m)] for _ in range(n)] [print(*i) for i in matrix]7. Хотя генераторы и списковые включения являются, по сути, сжатой формой записи цикла, в синтаксисе циклов и генераторов есть различия. Например, в генераторax и списковыx включениях, в отличие от циклов, не используются операторы break и continue – вместо этого условие формулируется по-другому:
st = input() sp = [] for i in st: if i.isalpha(): sp.append(i) else: continue print(sp)sp2 = [i for i in st if i.isalpha()] print(sp2)8. Для параллельной итерации вместо вложенного цикла удобнее использовать простой for вместе с функцией zip():
>>> list1 = ['а', 'б', 'в', 'г', 'д'] >>> list2 = [1, 2, 3, 4, 5] >>> for i, j in zip(list1, list2): print(i + str(j)) а1 б2 в3 г4 д5Другой способ параллельной итерации – использование индекса одного из списков. Для обращения к индексам в range() включают функцию len():
>>> lst1 = ['a', 'b', 'c', 'd', 'e'] >>> lst2 = [11, 12, 13, 14, 15] >>> for i in range(len(lst1)): print(lst1[i], lst2[i]) a 11 b 12 c 13 d 14 e 159. Для работы с индексами в цикле часто используется функция enumerate():
>>> my_list = ['хард-рок', 'хэви-метал', 'хип-хоп', 'рэп', 'панк-рок'] >>> for i, j in enumerate(my_list): print(i, j) 0 хард-рок 1 хэви-метал 2 хип-хоп 3 рэп 4 панк-рок10. При решении задач в циклах часто используют счетчики. Так, например, можно подсчитать количество отрицательных чисел:
lst = [5, 6, -3, 1, 12, -2, -7, 8, 3, 2] k = 0 for i in lst: if i < 0: k += 1 print(f'Количество отрицательных чисел: ')Количество отрицательных чисел: 3Практика
Задание 1
Напишите программу, которая получает от пользователя число n и выводит n строк с результатом умножения чисел от 1 до n на символ *.
Пример ввода:
Умножаю * на 1: * Умножаю * на 2: ** Умножаю * на 3: *** Умножаю * на 4: **** Умножаю * на 5: ***** Умножаю * на 6: ****** Умножаю * на 7: *******n = int(input()) for i in range(1, n + 1): print(f"Умножаю * на : ")Задание 2
Напишите программу, которая получает от пользователя строку целых чисел, и выводит:
- Количество положительных чисел.
- Произведение всех отрицательных чисел.
- Минимальное и максимальное числа без использования функций min() и max().
Пример ввода:
3 -5 2 4 12 7 3 4 6 9 25 -50 12 35 2 11Количество положительных чисел: 14 Произведение отрицательных чисел: 250 Минимальное число: -50 Максимальное число: 35lst = map(int, input().split()) pos = 0 neg_prod = 1 min_num = 0 max_num = 0 for i in lst: if i > 0: pos += 1 elif i < 0: neg_prod *= i if i < min_num: min_num = i elif i >max_num: max_num = i print(f'Количество положительных чисел: ') print(f'Произведение отрицательных чисел: ') print(f'Минимальное число: ') print(f'Максимальное число: ')Задание 3
Напишите программу, которая создает вложенный список из n строк, полученных от пользователя, и выводит сумму и произведение элементов каждого подсписка (без использования sum() и math.prod()).
Пример ввода:
6 4 5 6 7 8 2 1 3 9 8 6 4 3 2 6 9 7 6 3 2 1 4 5 7 2 7 3 2 1 6Подсписок 0: сумма чисел = 30, произведение = 6720 Подсписок 1: сумма чисел = 53, произведение = 2903040 Подсписок 2: сумма чисел = 74, произведение = 2508226560 Подсписок 3: сумма чисел = 101, произведение = 5688657838080 Подсписок 4: сумма чисел = 120, произведение = 1592824194662400 Подсписок 5: сумма чисел = 139, произведение = 401391697054924800n = int(input()) lst = [] for i in range(n): lst.append(list(map(int, input().split()))) summa = 0 prod = 1 for i, j in enumerate(lst): for num in j: summa += num prod *= num print(f'Подсписок : сумма чисел = , произведение = ')Задание 4
Напишите программу, которая получает от пользователя строку текста и число n, а затем выводит вложенный список, в котором n последовательных элементов принадлежат разным подспискам.
Пример ввода:
абвгдеёжзийклмнопрстуфхцчшщъыьэюя 9[['а', 'и', 'с', 'ъ'], ['б', 'й', 'т', 'ы'], ['в', 'к', 'у', 'ь'], ['г', 'л', 'ф', 'э'], ['д', 'м', 'х', 'ю'], ['е', 'н', 'ц', 'я'], ['ё', 'о', 'ч'], ['ж', 'п', 'ш'], ['з', 'р', 'щ']]st = list(input()) n = int(input()) result = [] for i in range(n): result.append(st[i::n]) print(result)Задание 5
Напишите программу для транспонирования квадратной матрицы.
Пример ввода:
5 1 4 7 8 9 3 5 6 1 0 8 2 4 7 2 8 1 0 3 6 5 4 9 1 21 3 8 8 5 4 5 2 1 4 7 6 4 0 9 8 1 7 3 1 9 0 2 6 2n = int(input()) matrix = [input().split() for _ in range(n)] for i in range(n): for j in range(i, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] for i in matrix: print(*i)Задание 6
Напишите программу, которая выводит на экран снежинку размера n x n. Элементы снежинки состоят из символов *, фон – из точек.
Пример ввода:
n = int(input()) snowflake = [['.'] * n for _ in range(n)] for i in range(n): for j in range(n): if i == n // 2 or j == n // 2: snowflake[i][j] = '*' elif i == j or i + j + 1 == n: snowflake[i][j] = '*' for line in snowflake: print(*line)Задание 7
Напишите программу, которая:
- создает квадратную матрицу из полученных на вход строк;
- проверяет, является ли матрица симметричной относительно побочной диагонали;
- выводит Да или Нет в зависимости от результата.
Пример ввода:
4 1 2 3 1 2 2 2 3 3 3 2 2 4 3 2 1n = int(input()) matrix = [] for _ in range(n): matrix.append(list(map(int, input().split()))) ans = 'Да' for i in range(n - 1): for j in range(n - i - 1): if matrix[i][j] != matrix[n - j - 1][n - i - 1]: ans = 'Нет' break if ans == 'Нет': break print(ans)Задание 8
Пример ввода:
1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 7 = 7 1 * 8 = 8 1 * 9 = 9 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45n = int(input()) for i in range(1, n + 1): for j in range(1, 10): print(i, '*', j, '=', i * j) print()Задание 9
Напишите программу, которая получает на вход нечетное положительное число n, и выводит треугольник, указывающий вправо.
Пример ввода:
n = int(input()) for i in range(1, n // 2 + 2): print('*' * i, sep='\n') for i in range(n // 2, 0, -1): print('*' * i)Задание 10
Напишите программу, которая:
- получает на вход x и y координаты n точек;
- подсчитывает количество точек в каждой из координатных четвертей.
Примечание: к четвертям не относят точки, лежащие непосредственно на координатных осях X и Y.
Пример ввода:
8 -4 1 3 6 7 -9 -1 -10 15 5 -12 15 11 17 -10 1Первая четверть: 3 Вторая четверть: 3 Третья четверть: 1 Четвертая четверть: 1q_1, q_2, q_3, q_4 = 0, 0, 0, 0 for _ in range(int(input())): x, y = [int(i) for i in input().split()] if int(x) > 0 and int(y) > 0: q_1 += 1 elif int(x) < 0 and int(y) >0: q_2 += 1 elif int(x) < 0 and int(y) < 0: q_3 += 1 elif int(x) >0 and int(y) < 0: q_4 += 1 print(f'Первая четверть: ', f'Вторая четверть: ', f'Третья четверть: ', f'Четвертая четверть: ', sep='\n')Подведем итоги
Цикл for универсален – его можно использовать для ввода, обработки и вывода данных. Простые циклы удобнее заменять генераторами и списковыми включениями, но сложные лучше использовать в обычном, развернутом виде – это упрощает отладку и чтение кода.
В следующей статье будем изучать особенности цикла while.
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
