Цикл for в Python предназначен для последовательного прохождения по элементам структур данных и некоторых других объектов. Этот цикл отличается от цикла for, характерного для многих других языков, где он выступает в роли счетчика.
Что подразумеваем под "перебором элементов"? Представьте, что у нас есть список с несколькими элементами. Сначала мы берем первый элемент, затем второй, потом третий и так далее. Над каждым элементом выполняются одинаковые операции внутри цикла for. При этом не нужно указывать индексы и беспокоиться, когда элементы закончатся, ведь цикл for сделает это за нас.
>>> spisok = [10, 40, 20, 30] >>> for element in spisok: ... print(element + 2) ... 12 42 22 32
Переменная element используется в ключевом слове for, но имя может быть произвольным, например, i. Во время каждой итерации for она принимает очередной элемент из списка spisok. Таким образом, при первой итерации element станет равен 10, на второй - 40 и так далее. Как только элементы списка spisok заканчиваются, цикл прекращает выполнение.
С английского "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. Определить длину можно благодаря встроенной функции len() в Python:
>>> i = 0 >>> while i < len(spisok): ... spisok[i] = spisok[i] + 2 # или spisok += 2 ... i = i + 1 # или i += 1 ... >>> spisok [14, 44, 24, 34]
Цикл while позволяет избавиться от переменной element.
Функция range()
Поговорим о встроенной функции Python 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) <class 'range'>
Несмотря на невидимость последовательности чисел, она существует, и доступ к элементам возможен:
>>> a[0] -10 >>> a[5] -5 >>> a[15] 5 >>> a[-1] 9
Однако изменить их нельзя, ведь, в отличие от списков, объекты range() неизменяемы:
>>> a[10] = 100 Traceback (most recent call last): File "<stdin>", line 1, in <module> 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():
>>> for i in range(len(spisok)): ... spisok[i] += 2 ... >>> spisok [16, 46, 26, 36]
В заголовке цикла for перебираем не элементы списка, а объект range. Сам список не обязан упоминаться. Если заранее известна длина, заголовок
может быть в виде: for i in range(4)
. Как используется i в цикле, это уже вопрос второй. Примечание:
индикатор i можно заменить на любое другое имя.
Практическая работа
- Создайте список, наполненный случайными числами. В коде используйте цикл for, функции range() и randint().
- Преобразуйте объект range (диапазон) в список с помощью встроенной функции list(), создав диапазон с элементами от 0 до 100 с шагом 17.
- Определите количество отрицательных чисел в списке, состоящем из положительных и отрицательных чисел, и выведите результат.
- Создайте программу, которая заполняет список пятью введенными словами, определяет длину каждого и добавляет их в другой список. Например, список слов – ['yes', 'no', 'maybe', 'ok', 'what'], список длин – [3, 2, 5, 2, 4]. Оба списка следует вывести на экран.