Стоит ли пользоваться индексами в циклах Python
Программируя на C, JavaScript, Java и многих других языках в ходе обработки различных последовательностей с помощью циклов мы привыкли всегда прибегать к индексам. На Python такой подход тоже вполне реализуем и может иметь следующий вид:
>>> fruit_basket = ["вишня", "груша", "арбуз", "яблоко", "черника"]
>>> for i in range(len(fruit_basket)):
... print(fruit_basket[i])
...
вишня
груша
арбуз
яблоко
черника
Однако, есть несколько причин, по которым применять индексы при обработке данных в Python циклах не рекомендуется. Во-первых, о нежелательности таких действий говорится непосредственно в официальном руководстве по стилю Python кода (PEP 8). Во-вторых, применение индексов в циклах допустимо лишь для последовательностей.
Последовательность – это пронумерованная совокупность объектов (элементов), доступ к которым осуществляется с помощью номеров (индексов) этих объектов, указываемых в квадратных скобках. Индексом 1-го элемента последовательности всегда является 0 (ноль). Таким образом индекс последнего элемента последовательности всегда будет равен длине последовательности (количеству элементов в ней) за вычетом единицы. К последовательностям относятся такие структуры данных, как: строки, кортежи и списки. Такие же данные, как: наборы, словари, файлы, генераторы и множество других структур, последовательностями не являются.
Но, даже если индексы мы используем лишь для обработки наших последовательностей в циклах, то все равно, на самом деле мы делаем много той работы, которую изначально Python, как язык высокого уровня, параллельно уже выполняет у себя под “капотом” автоматически. Так, в вышеприведенном примере мы излишне в цикле for указали выражение range(len(fruit_basket)), возвращающее индексы нашего списка в переменную i
, а затем использовали эту переменную для доступа и распечатки элементов данного списка. Всю эту работу Python провел у себя под "капотом" и без нас, а мы написав этот излишний код, мало того, что усложнили читабельность программы, так еще практически вдвое увеличили количество выполняемых ею команд.
Кроме того, основная переменная i
в цикле вышеприведенного примера ассоциируется не с самым обрабатываемым нами элементом, а с его индексом, что также существенно усложняет читабельность и понимание логики программы.
Таким образом, при программировании циклов Python необходимо избегать применения индексов и, вместо них использовать переменную для непосредственного (итерируемого) элемента последовательности. Исходя из этой рекомендации, приведенный выше пример можно переписать следующим образом:
>>> fruit_basket = ["вишня", "груша", "арбуз", "яблоко", "черника"]
>>> for fruit in fruit_basket:
... print(fruit)
...
вишня
груша
арбуз
яблоко
черника
Следовательно, при написании for циклов на Python, вам нужно лишь делать это максимально просто, исходя из того, что доступ к элементам любых последовательностей в этих циклах осуществляется не через индексы, а на прямую через значения самых этих элементов в последовательностях.
Возможно будет интересно
Применение геттер и сеттер методов для закрытых атрибутов классов
Что же все-таки обозначает эта загадочная ИНКАПСУЛЯЦИЯ и, как она может быть реализована в классах Python с помощью не менее таинственных ГЕТТЕР и СЕТТЕР методов. Обо всем этом мы с вами узнаем из этой статьи.
Как практиковаться в Python?
Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?