For python что это
Перейти к содержимому

For python что это

  • автор:

Цикл for

Цикл for в языке программирования Python предназначен для перебора элементов структур данных и других составных объектов. Это не цикл со счетчиком, каковым является for во многих других языках.

Что значит перебор элементов? Например, у нас есть список, состоящий из ряда элементов. Сначала берем из него первый элемент, затем второй, потом третий и так далее. С каждым элементом мы выполняем одни и те же действия в теле for . Нам не надо извлекать элементы по их индексам, заботиться, на каком из них список заканчивается, и следующая итерация бессмысленна. Цикл for сам переберет и определит конец.

>>> spisok = [10, 40, 20, 30] >>> for element in spisok: . print(element + 2) . 12 42 22 32

После ключевого слова for используется переменная под именем element . Имя здесь может быть любым. Нередко используют i . На каждой итерации цикла for ей будет присвоен очередной элемент из списка spisok . Так при первой прокрутке цикла идентификатор element связан с числом 10, на второй – с числом 40, и так далее. Когда элементы в spisok заканчиваются, цикл for завершает свою работу.

С английского «for» переводится как «для», «in» как «в». Перевести конструкцию с языка программирования на человеческий можно так: для каждого элемента в списке делать следующее (то, что в теле цикла).

В примере мы увеличивали каждый элемент на 2 и выводили его на экран. При этом сам список конечно же не изменялся:

>>> spisok [10, 40, 20, 30]

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

>>> i = 0 >>> for element in spisok: . spisok[i] = element + 2 . i += 1 . >>> spisok [12, 42, 22, 32]

Но если мы вынуждены использовать счетчик, то выгода от использования цикла for не очевидна. Если знать длину списка, то почему бы не воспользоваться while . Длину можно измерить с помощью встроенной в Python функции len() .

>>> i = 0 >>> while i < len(spisok): . spisok[i] = spisok[i] + 2 # или spisok[i] += 2 . i = i + 1 # или i += 1 . >>> spisok [14, 44, 24, 34]

Кроме того, с циклом while мы избавились от переменной element .

Функция range()

Теперь пришло время познакомиться со встроенной в Python функцией range() . «Range» переводится как «диапазон». Она может принимать один, два или три аргумента. Их назначение такое же как у функции randrange() из модуля random . Если задан только один, то генерируются числа от 0 до указанного числа, не включая его. Если заданы два, то числа генерируются от первого до второго, не включая его. Если заданы три, то третье число – это шаг.

Однако, в отличие от randrange() , функция range() генерирует не одно случайное число в указанном диапазоне. Она вообще не генерирует случайные числа. Она генерирует последовательность чисел в указанном диапазоне. Так, range(5, 11) сгенерирует последовательность 5, 6, 7, 8, 9, 10. Однако это будет не структура данных типа «список». Функция range() производит объекты своего класса – диапазоны:

>>> a = range(-10, 10) >>> a range(-10, 10) >>> type(a)

Несмотря на то, что мы не видим последовательности чисел, она есть, и мы можем обращаться к ее элементам:

>>> a[0] -10 >>> a[5] -5 >>> a[15] 5 >>> a[-1] 9

Хотя изменять их нельзя, так как, в отличие от списков, объекты range() относятся к группе неизменяемых:

>>> a[10] = 100 Traceback (most recent call last): File "", line 1, in TypeError: 'range' object does not support item assignment

Цикл for и range()

Итак, зачем нам понадобилась функций range() в теме про цикл for ? Дело в том, что вместе они образуют неплохой тандем. For как цикл перебора элементов, в отличие от while , позволяет не следить за тем, достигнут ли конец структуры. Не надо вводить счетчик для этого, изменять его и проверять условие в заголовке. С другой стороны, range() дает последовательность целых чисел, которые можно использовать как индексы для элементов того же списка.

>>> range(len(spisok)) range(0, 4)

Здесь с помощью функции len() измеряется длина списка. В данном случае она равна четырем. После этого число 4 передается в функцию range() , и она генерирует последовательность чисел от 0 до 3 включительно. Это как раз индексы элементов нашего списка.

Теперь «соединим» for и range() :

>>> spisok = [14, 44, 24, 34] >>> for i in range(len(spisok)): . spisok[i] += 2 . >>> spisok [16, 46, 26, 36]

Еще раз обратим внимание, в заголовке цикла for берутся элементы вовсе не списка, а объекта range .

Практическая работа

  1. Заполните список случайными числами. Используйте в коде цикл for, функции range() и randint() .
  2. Если объект range (диапазон) передать встроенной в Python функции list() , то она преобразует его к списку. Создайте таким образом список с элементами от 0 до 100 и шагом 17.
  3. В заданном списке, состоящем из положительных и отрицательных чисел, посчитайте количество отрицательных элементов. Выведите результат на экран.
  4. Напишите программу, которая заполняет список пятью словами, введенными с клавиатуры, измеряет длину каждого слова и добавляет полученное значение в другой список. Например, список слов – [‘yes’, ‘no’, ‘maybe’, ‘ok’, ‘what’], список длин – [3, 2, 5, 2, 4]. Оба списка должны выводиться на экран.

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Цикл for — Python: Списки

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

Возьмем для примера счетчик, который мы изменяем в цикле. При работе с коллекциями нам нужно как-то выбирать, с каким элементом мы работаем в текущей итерации. Так что же, использовать переменную-счетчик каждый раз?

Любой программист всегда стремится автоматизировать рутинную работу, и авторы языков — не исключение. Поэтому в Python для работы с коллекциями существует другой вид цикла — цикл for .

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

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

Синтаксис

Цикл for устроен очень просто:

for element in collection: print(element) # this is body of cycle 

Заметьте, в простейшем случае у цикла даже нет явного условия завершения. Цикл просто останавливается, когда в коллекции заканчиваются элементы.

Пример выше сработает для кортежей и списков — в этом случае будут выведены все элементы. А еще коллекции можно проитерировать — так называют обход коллекции. В таком случае переменная цикла ( element ) будет поочередно содержать все символы строки:

for c in 'Hello!': print(c) # => H # => e # => l # => l # => o # => ! 

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

На этот случай в Python есть удобная функция «пронумеровать» — enumerate . Эта функция снабжает каждый элемент индексом, складывая каждый индекс вместе с элементом в кортеж. Кортежи эти, как правило, прямо в первой строке цикла и распаковывают:

items = ['foo', 'bar', 'baz'] for (index, elem) in enumerate(items): print(f'index> elem>') # => 0 foo # => 1 bar # => 2 baz 

В этом цикле мы вывели каждый элемент рядом с его индексом.

Теперь посмотрим на такой пример:

items = ['foo', 'bar', 'baz'] for (index, _) in enumerate(items): items[index] += '!' print(items) # => ['foo!', 'bar!', 'baz!'] 

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

Это не какая-то особая переменная, а всего лишь соглашение: в Python часто незначимые в этом контексте вещи записывают в переменную _ .

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

Управление циклом с помощью break и continue

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

Такой ранний выход из цикла делается с помощью команды break . Вот цикл поиска первого положительного числа:

items = [-2, 0, -10, 3, 5, -1] for item in items: if item > 0: break print(item) # => 3 

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

Этот код, кажется, работает как надо. Однако если в списке не встретится ни одного положительного числа, то в переменной item окажется просто последний элемент списка.

Как же понять, что мы ничего не нашли? На помощь приходит else . В цикле else выполняется, если цикл так и не прервался с помощью break . Для алгоритмов поиска — это идеальный вариант. Перепишем наш пример с применением else :

items = [-2, 0, -10, -1] for item in items: if item > 0: break else: item = None print(item) # => None 

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

Для перехода к следующей итерации предназначена команда continue . Ее использование продемонстрирует следующий пример: мы читаем строки, содержащие строчки кода, но нам не нужно обрабатывать код тех строчек, которые начинаются с символа # . Вот так будет выглядеть код:

lines_of_code = [ '# begin of example', 'echo 123', 'cd foo', '# end'] for line in lines_of_code: if line[:1] == '#': continue # Здесь происходит обработка кода print(line) # => echo 123 # => cd foo 

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

break , continue , else и цикл while

Ветка else и команды break и continue доступны и для цикла while . Вот комплексный пример, демонстрирующий все эти возможности:

tries_count = 3 while tries_count: print('>>> ', end='') command = input() if not command: continue if command in ('echo', 'cd', 'help'): break print('Unknown command!') tries_count -= 1 else: print('Too many bad tries!') command = None 

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

Цикл for и изменяемые коллекции

Хотим предостеречь от изменения состава списка во время обхода его же в цикле for . Программа может завершиться с ошибкой, если вы будете менять список, по которому проходитесь — например, удалять или добавлять новые элементы. Лучше наполнять новый список в процессе обхода старого.

Если вы хотите обязательно изменить состав исходного списка, то обходите в цикле его копию:

for x in original_list[:]: original_list.pop(0) 

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

new_list = [] for x in original_list: . original_list[:] = [] # удаляем старое содержимое original_list.extend(new_list) 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Цикл 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, сопоставление с образцом

Синтаксис и возможности цикла for Python

Циклы python — for и while представляют собой операторы языка программирования, то есть операторы итерации, которые позволяют повторять код определенное количество раз.

Синтаксис цикла For

Как уже упоминалось ранее, цикл for в Python является итератором, основанным на цикле. Он проходит по элементам list и tuple, строкам, ключам словаря и другим итерируемым объектам.

В Python цикл начинается с ключевого слова for , за которым следует произвольное имя переменной, которое будет хранить значения следующего объекта последовательности. Общий синтаксис for. in в python выглядит следующим образом:

for in : else:

Элементы «последовательности» перебираются один за другим «переменной» цикла; если быть точным, переменная указывает на элементы. Для каждого элемента выполняется «действие».

Пример простого цикла for в Python:

 
 
>>> languages = ["C", "C++", "Perl", "Python"] >>> for x in languages: . print(x) . C C++ Perl Python >>>

Блок else является особенным; в то время как программист, работающий на Perl знаком с ним, это неизвестная конструкция для программистов, которые работают на C и C++. Семантически он работает точно так же, как и в цикле while .

Он будет выполнен только в том случае, если цикл не был «остановлен» оператором break . Таким образом, он будет выполнен только после того, как все элементы последовательности будут пройдены.

Оператор прерывания в python — break

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

Обычно фразы break в pyton связаны с условными операторами.

 
 
edibles = ["отбивные", "пельмени", "яйца", "орехи"] for food in edibles: if food == "пельмени": print("Я не ем пельмени!") break print("Отлично, вкусные " + food) else: print("Хорошо, что не было пельменей!") print("Ужин окончен.")

Если мы запустим этот код, получим следующий результат:

Отлично, вкусные отбивные Я не ем пельмени! Ужин окончен.

Удалим «пельмени» из нашего списка еды и получим следующее:

Отлично, вкусные отбивные Отлично, вкусные яйца Отлично, вкусные орехи Хорошо, что не было пельменей! Ужин окончен. 

Оператор пропуска python — continue

Предположим, нам «пельмени» нам нужно просто пропустить и продолжить прием пищи. Тогда нужно использовать оператор continue , для перехода к следующему элементу.

В следующем маленьком скрипте python мы используем continue , чтобы продолжить, итерацию по списку, когда мы сталкиваемся с пельменями.

 
edibles = ["отбивные", "пельмени", "яйца", "орехи"] for food in edibles: if food == "пельмени": print("Я не ем пельмени!") continue print("Отлично, вкусные " + food) else: print("Ненавижу пельмени!") print("Ужин окончен.")

Результат будет следующим:

Отлично, вкусные отбивные Я не ем пельмени! Отлично, вкусные яйца Отлично, вкусные орехи Ненавижу пельмени! Ужин окончен.

Итерация по спискам с функцией range()

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

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

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