Что такое for в python
Перейти к содержимому

Что такое for в python

  • автор:

Python цикл for — for i in range

Циклы являются одной из основных управляющих конструкций в любом языке программирования, и Python не является исключением.

В этой статье мы рассмотрим несколько примеров использования циклов for с функцией range() в Python.

Циклы for в Python

Циклы for повторяют определённый код для некоторого набора значений.

Из документации Python можно узнать, что в нем циклы for работают несколько иначе, чем в таких языках, как JavaScript или C.

Цикл for присваивает итерируемой переменной каждое значение из предоставленного списка, массива или строки и повторяет код в теле цикла for для каждого установленного таким образом значения переменной-итератора.

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

Использование циклов while и for в Python

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

Цели обучения

После изучения этого модуля вы сможете сделать следующее.

  • Понимать, когда использовать циклы while и for .
  • Несколько раз запускать задачу с помощью циклов while .
  • Выполнять циклический перебор данных списка с помощью циклов for .

Предварительные требования

  • Основные знания по программированию на Python, в том числе использование переменных, строк, целых чисел и математических выражений.
  • Опыт работы со списками в Python.
  • Опыт с изменением и выполнением кода в записных книжках Jupyter.

Цикл for/in в Python

Цикл for в Python немного отличается от того, что можно использовать в C или Pascal. for в Python не перебирает арифметическую прогрессию чисел, например как в Pascal, не дает пользователю возможность определять шаг итерации и условие остановки, как C. Вместо этого инструкция for в Python перебирает элементы любой итерируемой последовательности iterable (список list , строку string , кортеж tuple , словарь dict или другого объекта, поддерживающего итерацию) в том порядке, в котором они появляются.

>>> words = ['cat', 'window', 'defenestrate'] # проходимся по списку `words` >>> for w in words: . print(w) . # cat # window # defenestrate 

Также внутри цикла можно извлекать элементы списка по индексу. Для этого определим количество элементов n в списке при помощи функции len() , а затем сгенерируем арифметическую последовательность range(n) , которую будем перебирать:

>>> words = ['cat', 'window', 'defenestrate'] # определим количество элементов в списке >>> n = len(words) # перебираем последовательность `range(n)` >>> for i in range(n): # извлекаем элементы списка # `words` по индексу `i` . print(words[i]) . # cat # window # defenestrate 

Изменено в Python 3.11: Теперь в списке выражений разрешены элементы, отмеченные звездочкой (смотрите «Передача произвольного числа аргументов»). Эта возможность была доступна в версиях Python 3.9 и 3.10, официально задокументирована в Python 3.11.

for x in *a, *b: print(x) 

Словарь Python — это такая же последовательность, которая имеет представления dict.items() , dict.keys() , dict.values() по которым можно итерироваться:

>>> d = 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'> >>> for key, value in d.items(): . print(key, ': ' ,value) . # 0 : zero # 1 : one # 2 : two # 3 : three # 4 : four # 5 : five 

Код, который изменяет коллекцию (список, словарь и т.д.) во время итерации по этой же коллекции, может привести к неожиданному результату, совершенно не тому, который ожидался. Не делайте так НИКОГДА! Намного проще и безопаснее выполнить цикл над копией коллекции:

# допустим `users` - это словарь Python # создаем копию словаря `users` users_copy = users.copy() # проходимся по копии словаря `users` for user, status in users_copy.items(): if status == 'inactive': # изменяем исходный словарь del users[user] 

или создать новую коллекцию:

# создаем новый словарь active_users = <> # проходимся по словарю `users` for user, status in users.items(): # отбираем пользователей if status == 'active': # добавляем в новый словарь # отобранных пользователей active_users[user] = status 

Спецификация оператора for/in/else .

for_stmt :: = "for" target_list "in" expression_list ":" suite ["else" ":" suite] 

Список выражений для перебора инструкцией for вычисляется один раз и должен давать объект поддерживающий итерацию. Итератор создается для результата expression_list . Каждый элемент из expression_list в свою очередь присваивается целевой переменной target_list , значение которой передается в блок кода внутри инструкции for . Затем код блока for выполняется один раз для каждого элемента. Когда элементы исчерпаны, что происходит сразу же, когда последовательность пуста или итератор вызывает исключение StopIteration , выполняется набор в предложении else , если он присутствует, и цикл завершается.

  • Оператор break : выполняется код внутри for до оператора break и завершает цикл без выполнения блока внутри else .
  • Оператор continue : выполняется код внутри for до оператора continue , пропускает оставшуюся часть кода в блоке for и продолжает работу со следующим элементом списка перебираемых выражений или с оператором else , если следующего элемента нет.

Применим оператор break и continue в коде for/in/else и посмотрим на их поведение. Будем создавать список четных чисел из последовательности чисел от 0 до 14.

lst = [] for item in range(15) : # если число 10 есть в списке if 10 in lst: # прерываем цикл, при этом блок else не выполнится break # остаток от деления элемента списка a = item % 2 # если элемент списка не четный или равен 0 if a != 0 or item == 0: # пропускаем оставшийся код continue # добавление числа в список lst.append(item) else: print ("Напечатает, если убрать условие с break") print(lst) # Код выведет: [2, 4, 6, 8, 10] 

Цикл for выполняет назначения переменным в целевом списке. Это перезаписывает все предыдущие назначения этим переменным, включая те, которые были сделаны в блоке for-loop :

Пример:

for i in range(10): print(i) i = 5 # это не повлияет на цикл for так как переменная i # будет перезаписана следующим итерируемым элементом 

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

Подсказка: встроенная функция range() возвращает итератор целых чисел, подходящий для эмуляции эффекта языка Pascal for i: = a to b do; например, list(range(3)) возвращает список [0, 1, 2] .

Изменено в Python 3.11: Теперь в списке выражений разрешены элементы, отмеченные звездочкой (смотрите «Передача произвольного числа аргументов»). Эта возможность была доступна в версиях Python 3.9 и 3.10, официально задокументирована в Python 3.11.

for x in *a, *b: print(x) 

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

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

b = a[:] for item in b: if item  0: a.remove(item) 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Проверка условий, конструкция if/elif/else
  • Конструкция if/else в одну строку
  • Имитация оператора switch/case
  • while, цикл по условию
  • Цикл for
  • Числовые последовательности для цикла Python
  • Практическое применение for/in/else циклов
  • Инструкции break, continue и блок else в циклах Python
  • Оператор pass
  • Конструкция match/case, сопоставление с образцом

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' 

Разберем подробно как отрабатывает цикл в примере выше на каждом шаге итераций:

  1. В первой итерации в цикле result равен пустой строке, char равен первому символу ‘g’. Поэтому в result присваивается символ ‘g’ плюс пустая строка, в итоге сохраняется только символ ‘g’
  2. На второй итерации result уже хранит символ ‘g’, а char равен следующему символу ‘o’. В result записывается char + result , то есть ‘o’ + ‘g’
  3. На последней итерации в 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' 

Упражнение не проходит проверку — что делать? ��

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

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

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

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Определения

  • Агрегация — Накопление результата во время итераций и работа с ним после цикла.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *