Зарегистрируйтесь, чтобы продолжить обучение

Циклы с индексами Python: Списки

Цикл 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. Единственное, что нужно спискам – индекс.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

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

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 26 декабря
профессия
от 24 542 ₸ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

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