Цикл 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. Введение в программирование
Python: Формирование строк в циклах
Еще циклы можно использовать, чтобы формировать строки. Подобная задача часто встречается в веб-программировании. Она сводится к обычной агрегации, когда применяется интерполяция или конкатенация.
Переворот строки — алгоритмическая задача, которую задают на собеседованиях. Правильный способ перевернуть строку — использовать функцию из стандартной библиотеки. Но важно знать, как ее реализовать.
Один из алгоритмов выглядит так:
- Строим новую строку
- Перебираем символы исходной строки в обратном порядке
def reverse_string(string): index = len(string) - 1 reversed_string = '' while index >= 0: current_char = string[index] reversed_string = reversed_string + current_char # То же самое через интерполяцию # reversed_string = f'' index = index - 1 return reversed_string reverse_string('Game Of Thrones') # 'senorhT fO emaG' # Проверка нейтрального элемента reverse_string('') # ''
Разберем функцию построчно:
- index = len(string) — 1 — записываем в новую переменную индекс последнего символа строки (индексы начинаются с нуля)
- reversed_string = » — инициализируем строку, куда будем записывать результат
- while index >= 0: — условие: повторяем тело цикла, пока текущий индекс не дошел до 0 — до первого символа
- current_char = string[index] — берем из строки символ по текущему индексу
- reversed_string = reversed_string + current_char — записываем в строку-результат новое значение: текущая строка-результат + новый символ
- index = index — 1 — обновляем счетчик
- return reversed_string — когда цикл завершился, возвращаем строку-результат
Советуем скопировать эту функцию в https://replit.com/languages/python3 и поэкспериментировать с ней.
Работая со строками, программисты часто допускают ошибку — выходят за границы строки. Если неправильно подобрать начальное значение счетчика или допустить ошибку в предикате цикла, функция может обращаться к несуществующему символу.
Особенно часто забывают, что индекс последнего элемента всегда меньше на единицу размера строки. В строках начальный индекс равен 0 , значит, индекс последнего элемента — len(str) — 1 .
Задание
Реализуйте функцию my_substr() , которая извлекает из переданной строки подстроку указанной длины. Она принимает на вход два аргумента: строку и длину, и возвращает подстроку, начиная с первого символа:
string = 'If I look back I am lost' print(my_substr(string, 1)) # => 'I' print(my_substr(string, 7)) # => 'If I lo'
Используйте тот же подход, что в функции для переворота строки из урока: собирайте строку-результат в цикле, перебирая начальную строку до определённого момента.
Эту задачу можно решить при помощи слайсов. Но в этом упражнении мы хотим потренироваться в использовании циклов и поэтому реализуем эту функциональность самостоятельно. Именно так внутри и работают слайсы.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Цикл 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 Русаков Михаил Юрьевич. Все права защищены.
Как сложить все числа выведенные циклом for?
Есть некий цикл for, который расчитывает цену лимитных ордеров, который выводит следующее:
19030.95 18973.8 18878.55 18745.2 18573.75 18364.2 18116.55 17830.8 17506.95 17145.0
Вопрос как получить сумму всех этих чисел. Ниже сам цикл:
import math MAX_ORDERS = 10 base_order_price = 19050.00 #текущая цена монеты for i in range(MAX_ORDERS): setka = base_order_price - base_order_price * (MAX_ORDERS ** math.log(i + 1, MAX_ORDERS) * (i + 1)) / 100 / MAX_ORDERS print(setka)```
Отслеживать
задан 14 окт 2022 в 12:58
Online Film’s Online Film’s
5 3 3 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
используйте функцию sum — она складывает все значения в списке:
res = sum(base_order_price - base_order_price * (MAX_ORDERS ** math.log(i + 1, MAX_ORDERS) * (i + 1)) / 100 / MAX_ORDERS for i in range(MAX_ORDERS))
ну или по старинке с накоплением переменной:
res = 0 for i in range(MAX_ORDERS): setka = base_order_price - base_order_price * (MAX_ORDERS ** math.log(i + 1, MAX_ORDERS) * (i + 1)) / 100 / MAX_ORDERS res += setka