Цикл for
можно использовать не только для обхода списка, но и для повторения действий. Для этого используют функцию range()
.
Функция range()
в Python используется для генерации последовательностей чисел. Она часто применяется в циклах for
для задания диапазона чисел, которые нужно перебрать.
for i in range(1, 6):
print(i)
# => 1
# => 2
# => 3
# => 4
# => 5
Функция range в Python является встроенной функцией, которая создает последовательность чисел внутри определенного диапазона. Ее можно использовать в цикле for для контроля количества итераций.
У range()
есть несколько вариантов использования:
range(stop)
создает последовательность от 0 доstop - 1
range(start, stop)
создает последовательность от start доstop - 1
range(start, stop, step)
создает последовательность из чисел от start доstop - 1
, с шагомstep
Теперь попробуем вывести числа в обратном порядке
for i in range(3, 0, -1):
print(i)
# => 3
# => 2
# => 1
На примерах выше мы видим, что итерация завершается до конечного значения
Обход списка с использованием индекса
Можно использовать range()
для получения индексов элементов списка, что может быть полезно, если нужно работать с индексами:
user_names = ['petya', 'vasya', 'evgeny']
end = len(user_names)
# range(begin, end) создает последовательность чисел от begin до end
# значение end не включается в последовательность
for i in range(0, end):
print(user_names[i])
# => petya
# => vasya
# => evgeny
В данном коде создаем список из трех элементов — имен. Далее в цикле обходим список и выводим на экран все имена так, что каждое имя оказывается на новой строке (print()
автоматически делает перевод строки).
Рассмотрим этот этап подробнее. При обходе списка циклом for
счетчик, как правило, играет роль индекса в списке. Он инициализируется нулем и увеличивается до len(user_names) - 1
, что соответствует индексу последнего элемента.
А что, если нам нужно вывести значения в обратном порядке? Для этого есть два способа. Один — идти в прямом порядке, то есть от нулевого индекса до последнего, и каждый раз вычислять нужный индекс по такой формуле размер списка - 1 - текущее значение счетчика
.
user_names = ['petya', 'vasya', 'evgeny']
end = len(user_names)
for i in range(0, end):
index = (len(user_names) - 1) - i
print(user_names[index])
# => evgeny
# => vasya
# => petya
Другой способ подразумевает обход в обратном порядке, от верхней границы до нижней, то есть от последнего индекса списка к первому (нулю, так как индексирование начинается с нуля). В такой ситуации код меняется на следующий:
user_names = ['petya', 'vasya', 'evgeny']
end = len(user_names)
# Здесь в range передается третий параметр - шаг
# и так же как со срезами, если передается отрицательный шаг, то обход будет в обратную сторону
for i in range(end - 1, -1, -1):
print(user_names[i])
# => evgeny
# => vasya
# => petya
Код выше можно сделать проще с помощью функции reversed()
user_names = ['petya', 'vasya', 'evgeny']
end = len(user_names)
for i in reversed(range(end)):
print(user_names[i])
# => evgeny
# => vasya
# => petya
Изменение
Во время обхода списка его можно не только читать, но и модифицировать. Предположим, что перед нами стоит задача нормализации списка электронных адресов — например, приведение их к нижнему регистру. Тогда код будет выглядеть так:
emails = ['VASYA@gmAil.com', 'iGoR@yandex.RU', 'netiD@hot.CoM']
print(emails)
# => ['VASYA@gmAil.com', 'iGoR@yandex.RU', 'netiD@hot.CoM']
for i in range(0, len(emails)):
# lower() - стандартный метод строк Python
# преобразующий строку в нижний регистр
email = emails[i]
normalized_email = email.lower()
# Заменяем значение
emails[i] = normalized_email
print(emails)
# => ['vasya@gmail.com', 'igor@yandex.ru', 'netid@hot.com']
Ключевая строчка: emails[i] = normalized_email
. В ней происходит перезапись элемента под индексом i
.
Цикл while
Цикл for
можно заменить на while
. Тогда нам необходимо будет вручную изменять счетчик:
user_names = ['petya', 'vasya', 'evgeny']
i = 0
# Определяем цикл. В переменной name на каждом шаге цикла будет храниться следующий элемент списка
# Условие выполняется пока i < 3
while i < len(user_names):
name = user_names[i]
print(name)
# увеличиваем счетчик
i += 1
# => petya
# => vasya
# => evgeny
Цикл while
можно использовать для работы со списками, но он имеет несколько потенциальных минусов по сравнению с циклом for
, когда речь идёт о переборе элементов списка. В цикле while
нужно явно контролировать условие завершения.
Если вы забыли обновить счётчик или неправильно задали условие выхода, цикл может стать бесконечным. Например:
numbers = [10, 20, 30, 40]
i = 0
# Этот цикл будет бесконечным
while i < len(numbers):
print(numbers[i])
Или если укажете неверное условие, то выйдите за пределы списка:
numbers = [10, 20, 30, 40]
i = 0
# Этот цикл выйдет за границы списка
while i <= len(numbers):
print(numbers[i])
i += 1
# => 10
# => 20
# => 30
# => 40
# IndexError: list index out of range
Резюме
Цикл for
можно комбинировать со списками в любых вариантах. Список необязательно перебирать полностью и от начала до конца. Можно например смотреть только каждый второй элемент или двигаться до половины. Все это зависит от конкретной задачи.
Точно так же списки сочетаются с while
. Единственное, что нужно спискам – индекс.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.