Цикл 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 .
Практическая работа
- Заполните список случайными числами. Используйте в коде цикл for, функции range() и randint() .
- Если объект range (диапазон) передать встроенной в Python функции list() , то она преобразует его к списку. Создайте таким образом список с элементами от 0 до 100 и шагом 17.
- В заданном списке, состоящем из положительных и отрицательных чисел, посчитайте количество отрицательных элементов. Выведите результат на экран.
- Напишите программу, которая заполняет список пятью словами, введенными с клавиатуры, измеряет длину каждого слова и добавляет полученное значение в другой список. Например, список слов – [‘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 в Python

Цикл for в Python предназначен для перебора элементов, находящихся в коллекции. Зачем нужно перебирать эти элементы? Разумеется, что сам по себе перебор элементов нам ничего не дает. С каждым элементом, последовательно должно выполняться одно и тоже действие, указанное в теле цикла for.
Итерация цикла for в Python
Например, у нас есть список чисел. На первом проходе берется первое число, затем второе, третье и так далее и распечатывается на экране. Один виток совершения однотипного действия (взяли число и распечатали) — называется итерацией.
Чтобы оценить полезность цикла for, представим, как бы мы справились, если бы не было циклов. Создадим список с целыми числами и присвоим его переменной num. Обратимся по индексу к каждому элементу списка и распечатаем их. На экране вывелись все значения из списка.
num = (5, 10, 15)
print(num[0])
print(num[1])
print(num[2])
Нетрудно догадаться, что если список будет состоять из ста чисел, то слово print придется вводить 100 раз. В программировании такое расточительство не прокатит, иначе какой в нем смысл?
Создание цикла for по списку в Python
Решим ту же самую задачу (вывод элементов на экран), но с использованием цикла for. Цикл for будет сам брать элементы из списка, пока они не закончатся и делать с ними то, что указано в теле цикла.
num = (5, 10, 15) // 1
for elem in num: // 2
print (elem) // 3
// 1 — создали список num
// 2 — запускаем цикл for для каждого элемента (elem) в списке num
// 3 — вывести на экран все элементы
Мы получили такой же результат как и в первом случае, но более рациональным способом. Когда элементы списка заканчиваются, цикл for прекращает работу.
Синтаксис цикла for
- for — ключевое слово, с английского языка переводится как «для». Говоря простым языком — «Сделать для каждого элемента действие из тела цикла».
- elem — произвольное название переменной в цикле. Переменная elem поочерёдно принимает на себя значение из списка для дальнейшего выполнения команды из тела цикла.
- : — после двоеточия, с новой строки и с отступом в 4 пробела пишется тело цикла — какое-то действие.
Задача на цикл for
Условие задачи:
Посчитать сумму чисел в списке.
a = (10, 20, 30)
summa = 0
for number in a:
summa = summa + number
print (summa)
60 // вывод результата
Алгоритм решения задачи
Помимо переменной a со списком, объявляет ещё одну переменную summa с нулевым значением. При каждом новом прохождении цикла, обновляется результат сложения текущего значения из переменной summa со следующим элементом, пока мы не получим конечный результат. Значение переменной summa, поменялось по ходу итерации, с 0 до 60.
summa = 0 + 10 // 10
10 + 20 // 30
30 + 30 // 60
Функция range() в Python
Что делать, если количество элементов в списке внушительное, глупо последовательно прописывать все числа один за другим. Необходимо более элегантное решение. В Python есть встроенная функция range(), которая может принимать один, два или три аргумента. Функция range() генерирует последовательность чисел в указанном диапазоне. Если мы пропишем range(0, 10), то сгенерируется последовательность 0,1,2,3,4,5,6,7,8,9. Обратите внимание, что числа генерируются от первого аргумента до второго, не включая последнего. Зададим диапазон чисел, от 5 до 11 и выведем список сгенерированных чисел. Мы вывели числа списка в указанном диапазоне, не включая второй аргумент.
for i in range(5, 11):
print(i)
5
6
7
8
9
10
Цикл for и функция range() отлично выполняют свою работу, нам больше не нужно перечислять весь список. Кроме того, мы все так же можем обращаться к элементу по его индексу.
Вложенные циклы в Python
Цикл называется вложенным, если он располагается внутри другого цикла. С помощью вложенных циклов можно вывести на экран разные элементы, разное количество раз.
cars = [«mazda», «opel», «audi», «honda»]
for i in range(len(cars)): // 0, 1, 2, 3
for h in range(i+1):
print(cars[i])
mazda
opel
opel
audi
audi
audi
honda
honda
honda
honda
Как так получилось?
Функция range() у внешнего цикла последовательно выведет значение индексов от 0 до 4. На первой итерации цикла i = 0. Это значит, что переменная h вложенного цикла получит в диапазоне одно число и совершит одну итерацию. Поэтому название машины и индексом 0, выведется только один раз. Вернемся во внешний цикл и на второй итерации i = 1, а в диапазоне h = 0, 1 уже находится два числа. Вложенный цикл for пройдется по двум числам в диапазоне и название opel, выведется на экран два раза. При каждом следующем проходе, количество последовательных элементов будет увеличиваться на единицу.

![]()
Создано 21.10.2019 10:29:40
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2024 Русаков Михаил Юрьевич. Все права защищены.
Цикл while «Сумма последовательности чисел»
Здравствуйте. Начал изучать питон, иногда нападают жуткие тупняки. Ряд задач с этим циклом, вроде, решен и понятен, тут не могу никак понять, как формулировать решение. Определите сумму всех элементов последовательности, завершающейся числом 0. В этой и во всех следующих задачах числа, следующие за первым нулем, учитывать не нужно. def по этому курсу еще не было, не знаю, что это. Т.е. задачу нужно решить, исходя из того, что материал был по Занятие 1. Ввод-вывод, арифметические операции Занятие 2. Условная инструкция Занятие 3. Операции с целыми и вещественными числами Занятие 4. Цикл for Занятие 5. Строки Занятие 6. Цикл while Вот просто чего не понял.
i = 0 while int(input()) > 0: i += int(input()) print(i)
Но в этом случае суммируются элементы без первого, т.е. в том порядке, как входят, если делаю
i = 0 a = 0 while int(input()) >0: i += 1 for j in range(0:a): a += int(input()) print(a)
то говорит, что закончились числа для ввода. Т.е. в целом я понимаю, что вообще что-то не то делаю.
Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 18 дек 2014 в 10:21
33 1 1 золотой знак 1 1 серебряный знак 4 4 бронзовых знака
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Ошибка в том, что функция input() вызывается в двух местах, нужно вызывать её только в одном месте и использовать одно и то же возвращаемое значение как для проверки на ноль, так и для суммирования:
total = 0 # общая сумма while True: # бесконечный цикл n = int(input()) # каждая строка содержит целое число if n == 0: # нашли нуль break # выходим из цикла total += n # суммируем print(total) # печатаем результат
Код предполагает, что каждая последовательность завершается нулём. В противном случае нужно ловить EOFError исключение и обрабатывать возвращаемую пустую строку.
Чтобы самостоятельно найти ошибку в своём коде, в таких простых случаях, полезно выписать словами, что код делает строчка за строчкой (отладка методом утёнка).
Другие способы выразить то же самое для тестов (и для улучшения понимания задачи людьми, которые уже знают Питон, не для прямого использования):
import sys from itertools import takewhile print(sum(takewhile(lambda n: n != 0, map(int, sys.stdin))))
Не нулевые целые числа являются истиной в булевом контексте в Питоне, поэтому вместо
lambda n: n != 0 можно использовать просто bool (менее читаемый (явный) вариант).
Или даже (если каждая строчка содержит только числа, без пробелов):
print(sum(map(int, iter(input, '0'))))