Помощники цикла for в Python
![]()
В языке Python заложено много полезных инструментов, способных значительно упростить жизнь разработчику, если о них знать и уметь использовать. Мы рассмотрим четыре функции, которые помогут нам при работе с циклом for, а в некоторых случаях позволят вообще отказаться от него!
О операторах ветвления и циклах написано в уроке “Python. Урок 5. Условные операторы и циклы”.
В статье рассмотрим следующие функции:
Функция range
Функция range() создает объект, который внутри себя содержит итератор, выдающий элементы из диапазона, определяемого аргументами функции.
Создадим объект range .
>>> r = range(3)
Получим его итератор.
>>> ri = iter(r)
Используя next() , извлечем из него все элементы.
>>> next(ri) 0 >>> next(ri) 1 >>> next(ri) 2 >>> next(ri) Traceback (most recent call last): File "", line 1, in next(ri) StopIteration
Через параметры функции range можно задать диапазон и шаг. Создадим range , генерирующий числа от 1 до 10 с шагом 3.
>>> ri2 = iter(range(1,10,3)) >>> next(ri2) 1 >>> next(ri2) 4 >>> next(ri2) 7 >>> next(ri2) Traceback (most recent call last): File "", line 1, in next(ri2) StopIteration
Объект range идеально подходит для использования в цикле for . Работа цикла for организована следующим образом:
- получаем итератор у объекта, который предоставляет данные;
- используя функцию next() , извлекаем элементы на каждой итерации цикла;
- если произошел выброс исключения StopIteration , то выходим из цикла.
Пример: выведем список целых чисел от 0 до 2 на экран.
>>> for i in range(3): print(i) 0 1 2
Список чисел от 1 до 10 с шагом 2.
>>> for i in range(1, 10, 2): print(i) 1 3 5 7 9
Range можно использовать в List Comprehensions .
>>> [i for i in range(3)] [0, 1, 2]
Функция range() – мощный инструмент, позволяющий получать последовательности целых чисел в заданном диапазоне с определенным шагом, с доступом через итератор.
Функция enumerate
Функция enumerate() конструирует генератор по переданной в нее (через аргумент) объект. Она предоставляет кортежи, состоящие из двух элементов, первый из которых – индекс, а второй – значение, извлекаемое из объекта.
Рассмотрим простой пример: найти в строке первое вхождение символа ‘o’ и вывести номер его позиции. Эта задача может быть решена так.
>>> msg = "hello!" >>> i = 0 >>> for sym in msg: if sym == 'o': print("index font-weight: 400;">В этой программе нам пришлось заводить дополнительную переменную i, значение которой на каждой итерации цикла мы увеличивали на единицу. Это не очень удобно! Использование функции enumerate() позволит упростить решение. >>> msg = "hello!" >>> for tp in enumerate(msg): if 'o' in tp: print("index font-weight: 400;">В процессе работы цикла for из объекта, созданного функцией enumerate(), будут последовательно извлекаться следующие кортежи: (0, ‘h’) (1, ‘e’) (2, ‘l’) (3, ‘l’) (4, ‘o’)
После извлечения кортежа (4, ‘o’) , на экран выведется соответствующее сообщение и цикл завершится. Выведем все кортежи, получаемые из строки “hello!” с помощью функции enumerate() .
>>> for tp in enumerate(msg): print(tp) (0, 'h') (1, 'e') (2, 'l') (3, 'l') (4, 'o') (5, '!')
Функция enumerate() позволяет получить индексы элементов объекта при обходе его в цикле for без введения дополнительных переменных.
Функция map
Функция map() предоставляет возможность применить указанную функцию к каждому элементу объекта. В результате получим список из модифицированных элементов исходного объекта.
Решим задачу возведения в квадрат всех элементов списка с использованием цикла for .
>>> numbers = [1, 2, 3, 4, 5] >>> sq_nums = [] >>> for num in numbers: sq_nums.append(num**2) >>> sq_nums [1, 4, 9, 16, 25]
Эту задачу можно также решить с использованием List Comprehensions .
>>> sq_nums = [num**2 for num in numbers] >>> sq_nums [1, 4, 9, 16, 25]
Точно такой же результат получим, если воспользуемся функций map() .
>>> sq_nums = list(map(lambda x: x**2, numbers)) >>> sq_nums [1, 4, 9, 16, 25]
На первый взгляд такой подход может показаться сложнее предыдущего, но вся его мощь заключается в первом аргументе – функции, которая используется для модификации значений элементов объекта. Это может быть как lambda -функция, как в нашем примере, так функция, созданная с использованием ключевого слова def .
Результат работы функции map() можно использовать в цикле for .
>>> msg = "simple" >>> for sym in map(lambda x: x+'-', msg): print(sym, end='') s-i-m-p-l-e-
Используйте map() , если вам необходимо обработать элементы объекта, используя определенную функцию .
Функция zip
Функция zip() позволяет в одном цикле for производить параллельную обработку данных. Это очень мощный инструмент! Zip принимает в качестве аргументов объекты, элементы которых будут объединены в кортежи, полученную структуру можно превратить в список кортежей, если это необходимо.
Решим следующую задачу, демонстрирующую возможности zip() : в нашем распоряжении есть два списка, построим третий, каждый элемент которого будет формироваться как сумма элемента из первого списка и элемента из второго, умноженного на два.
>>> a = [1, 3, 5, 7, 9] >>> b = [2, 4, 6, 8, 10] >>> c = [] >>> for (x, y) in zip(a, b): c.append(x + 2 * y) >>> c [5, 11, 17, 23, 29]
Результат объединения списков с помощью функции zip() представлен ниже. Элементы исходных списков группируются попарно, образуя кортежи.
>>> a = [1, 3, 5, 7, 9] >>> b = [2, 4, 6, 8, 10] >>> list(zip(a, b)) [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
Если в функцию zip() передать три списка, то получим кортежи, состоящие из трех элементов.
>>> a = [1, 3, 5, 7, 9] >>> b = [2, 4, 6, 8, 10] >>> c = [10, 11, 12, 13, 14] >>> list(zip(a, b, c)) [(1, 2, 10), (3, 4, 11), (5, 6, 12), (7, 8, 13), (9, 10, 14)]
В случае, когда исходные списки имеют разную длину, итоговое количество кортежей будет равно числу элементов в самом коротком списке.
>>> a = [1, 3, 5, 7, 9] >>> d = [20, 21] >>> list(zip(a, d)) [(1, 20), (3, 21)]
С помощью функции zip() можно создавать словари.
>>> a = [1, 3, 5, 7, 9] >>> keys = ['a', 'b', 'c', 'd', 'e'] >>> dict(zip(keys, a))
Используйте zip() для параллельной обработки данных и быстрого построения структур данных. Такое решение будет функциональным и лаконичным!
Работа с циклами for в Python 3
Циклы позволяют автоматизировать выполнение последовательностей задач в программах.
В данном руководстве мы рассмотрим цикл for в языке программирования Python 3.
Цикл for повторно выполняет код согласно счетчику или переменной цикла. Циклы for используются тогда, когда количество итераций известно заранее, до запуска цикла (в отличие от цикла while, который выполняется согласно логическим условиям).
Основы работы с циклом for
В Python циклы for создаются таким образом:
for [iterating variable] in [sequence]:
[do something]
Цикл будет выполнять заданное действие ([do something]) до конца последовательности.
Для примера рассмотрим цикл for, который перебирает диапазон значений:
for i in range(0,5):
print(i)
Такая программа вернёт следующий вывод:
Этот цикл for использует i в качестве итерационной переменной. Последовательность существует в диапазоне от 0 до 5.
Выражение print внутри цикла выводит одно целое число для каждой итерации.
Примечание: В программировании отсчёт, как правило, начинается с 0. В диапазоне от 0 до 5 цикл выводит 0, 1, 2, 3, 4.
Циклы for обычно используются в ситуациях, когда программе необходимо повторить блок кода определённое количество раз.
Функция range()
Функция range() – это один из встроенных неизменяемых типов последовательностей Python. В циклах range() указывает, сколько раз нужно повторить последовательность.
Функция range() имеет такие аргументы:
- start указывает целое число, с которого начинается последовательность (включительно) . Если этот аргумент не указан, по умолчанию используется значение 0.
- stop нужно использовать всегда. Это последнее целое число последовательности (исключительно).
- step определяет шаг: насколько нужно увеличить (в случае с отрицательными числами уменьшить) следующую итерацию. Если аргумент step пропущен, по умолчанию используется 1.
Попробуйте передать функции range() несколько аргументов.
Для начала используйте только stop.
for i in range(6):
print(i)
В примере выше аргумент stop имеет значение 6, потому код выполнит итерацию от 0 до 6 (исключая 6).
Теперь попробуйте добавить аргумент start. Функция будет иметь такой вид:
Укажите диапазон, в котором нужно выполнить итерацию:
for i in range(20,25):
print(i)
В данном случае перебор начинается с 20 (включительно) и заканчивается на 25 (исключительно).
Аргумент step в функции range() определяет шаг (как в срезах строк); его можно использовать для пропуска значений в последовательности.
Попробуйте использовать все доступные аргументы. Они указываются в такой последовательности:
range(start, stop, step)
for i in range(0,15,3):
print(i)
В данном случае цикл for переберёт значения от 0 до 15 с шагом 3, в результате он выведет каждое третье число:
Также в качестве шага можно использовать отрицательные числа, тогда цикл будет перебирать значения в обратном направлении. В таком случае не забудьте откорректировать аргументы start и stop (поставьте их по убыванию).
for i in range(100,0,-10):
print(i)
В данном примере 100 – значение start, 0 – stop, -10 – шаг.
В Python циклы for часто используют функцию range() как один из параметров итерации.
Цикл for и последовательные типы данных
Списки и другие последовательные типы данных также можно использовать в качестве параметров итерации для цикла. Например, вместо функции range() вы можете определить список и итерацию по этому списку.
Присвойте список переменной, а затем запустите итерацию по нему:
sharks = ['hammerhead', 'great white', 'dogfish', 'frilled', 'bullhead', 'requiem'] for shark in sharks:
print(shark)
В данном случае цикл выведет каждый элемент списка.
hammerhead
great white
dogfish
frilled
bullhead
requiem
Списки и другие последовательные типы данных (строки и кортежи) часто используются в циклах, потому что они итерируемые. Можно комбинировать эти типы данных с функцией range(), чтобы добавить элементы в список, например:
sharks = ['hammerhead', 'great white', 'dogfish', 'frilled', 'bullhead', 'requiem'] for item in range(len(sharks)):
sharks.append('shark')
print(sharks)
['hammerhead', 'great white', 'dogfish', 'frilled', 'bullhead', 'requiem', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark']
Циклы for позволяют составлять новые списки:
integers = [] for i in range(10):
integers.append(i)
print(integers)
В данном случае инициированный список integers пуст, но цикл for добавляет в него данные:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Также можно выполнять итерацию строк:
8host = '8Host'
for letter in 8host:
print(letter)
8
H
o
s
t
Аналогичным образом можно выполнить итерацию кортежа.
При итерации словарей важно помнить о структуре «ключ: значение», чтобы вызывать правильные элементы из словаря. Например:
willy_orca =
for key in willy_orca:
print(key + ': ' + willy_orca[key])
name: Willy
animal: orca
location: ocean
color: black
При использовании словарей в циклах for итерируемое значение соответствует ключу кловаря, а dictionary_variable[iterating_variable] соответствует значению. Таким образом, в примере выше key – ключ, а willy_orca[key] – значение.
Вложенные циклы for
Python позволяет вкладывать циклы друг в друга.
Вложенный цикл – это цикл, который встречается внутри другого цикла. Структурно это похоже на выражение if.
Вложенный цикл выглядит так:
for [first iterating variable] in [outer loop]: # Outer loop
[do something] # Optional
for [second iterating variable] in [nested loop]: # Nested loop
[do something]
Программа сначала выполняет внешний цикл. Внутри первой итерации внешнего цикла запускается внутренний, вложенный цикл. Затем программа возвращается обратно к началу внешнего цикла, завершает вторую итерацию и снова вызывает вложенный цикл. После завершения вложенного цикла программа возвращается в начало внешнего цикла. Это будет происходить до тех пор, пока последовательность не будет завершена или прервана (или пока какое-то выражение не приведёт к нарушению процесса).
Попробуйте создать вложенный цикл. В данном примере внешний цикл будет перебирать список чисел (num_list), а внутренний – алфавит (alpha_list).
num_list = [1, 2, 3] alpha_list = ['a', 'b', 'c'] for number in num_list:
print(number)
for letter in alpha_list:
print(letter)
Такая программа выведет:
Программа завершает первую итерацию, выводя на экран 1, после чего запускается внутренний цикл, который выводит последовательно «a, b, c». После этого программа возвращается в начало внешнего цикла, выводит 2, а затем снова обрабатывает внутренний цикл.
Вложенные циклы for могут быть полезны для перебора элементов в списках, составленных из списков. Если в списке, который состоит из списков, использовать только один цикл, программа будет выводить каждый внутренний список в качестве элемента:
list_of_lists = [['hammerhead', 'great white', 'dogfish'],[0, 1, 2],[9.9, 8.8, 7.7]] for list in list_of_lists:
print(list)
['hammerhead', 'great white', 'dogfish'] [0, 1, 2] [9.9, 8.8, 7.7]
Чтобы вывести каждый отдельный элемент внутренних списков, нужно использовать вложенный цикл.
list_of_lists = [['hammerhead', 'great white', 'dogfish'],[0, 1, 2],[9.9, 8.8, 7.7]] for list in list_of_lists:
for item in list:
print(item)
hammerhead
great white
dogfish
0
1
2
9.9
8.8
7.7
Пример вложенного списка for можно найти в другой нашей статье.
Заключение
Теперь вы знаете, как работает цикл for в языке программирования Python. Циклы for выполняют блок кода заданное количество раз.
Читайте также:
- Циклы while в Python 3
- Операторы break, continue и pass в циклах Python 3
Цикл for в python. Изменение I в цикле
i изменяется. Вот только на следующем цикле в переменную i будет присвоено очередное значение из ряда (0,1,2,3,4,5,6) согласно вашему range(7) .
Если требуется просто идти с некоторым шагом, то используй соответствующие параметры для функции range() . Например, цикл:
for i in range(0, 7, 5): .
будет идти от 0 до 7 с шагом 5.
Если же вам требуется управлять шагом внутри цикла, то делайте это при помощи цикла while :
i = 0 while i < 7: if True: i += 5 else: i += 1 .
Как сделать шаг цикла for 0.1 в цикле Python?
Добрый день. Есть математическая задача "Вывести значения функции f(x) на отрезке [n-3;1] с шагом 0.1", сам цикл и формулу я написал, но когда я попытался выставить шаг 0.1 выдало ошибку о том что цифры с плавающий точной передавать как аргумент нельзя, в следствии чего вопрос как можно обойти эту ошибку?
import math n=12 for i in range(n-3, n+1, 0.1): a=(math.cos(i))/(2*math.tan(i)) b1=(6-i) b2=math.exp(b1) ab=a+b2 c=math.log(5*i-2) print("------------------------") print(str(i) + " | " + str(a)) print("------------------------")
- Вопрос задан более года назад
- 3080 просмотров
1 комментарий
Простой 1 комментарий
