Найти тему
Машинное обучение

Pythonic циклы

Поговорим о циклах в Python. Приведён пример цикла , который мог бы написать человек с C или Java бэкграундом: 

 

items = [‘a’, ‘b’, ‘c’]

i = 0

while i < len(items): 

  print(items[i])

  i += 1

Что с ним не так?

🤖здесь мы вручную отслеживаем индекс, а значит, создаем себе возможность сделать ошибку на единицу. Легко заехать в элемент items[3], заменив < на <=;

🤖 если тело цикла длинное, то частая ошибка это сделать так, что условие выхода никогда не выполнится, и войти в бесконечный цикл;

🤖 в Python можно выразительнее. 

А именно: 

 

for item in items: 

  print(item)

Это решение 

🦋освобождает от проблем, описанных выше, 

🦋использует продвинутые средства Python, о которых я еще когда-нибудь расскажу  

🦋читается почти как английский язык или псевдокод из учебника. 

О таком и говорят pythonic -- когда возможности языка используются, чтобы сделать код лаконичным, читаемым и поддерживаемым.  

Но что если вам правда, очень, действительно нужен индекс? Иногда это бывает, и тогда на помощь спешит конструкция enumerate(), которая предоставляет и сам элемент и его индекс: 

 

for i, item in enumerate(items): 

  print(i)

В общем, если вам в Python цикле нужно делать операции не с индексами, а с самими объектами, то средства языка позволяют писать чистый и менее подверженный ошибкам код. Если индексы все же нужны, выбирайте enumerate(): пользоваться индексами напрямую — это не pythonic.  

Закончу цитатой. 

«В программировании есть только две сложные вещи: инвалидация кеша, выбор имени переменной, и ошибки на единицу»  

(Джефф Этвуд, создатель StackOverflow).

#циклы #кодстайл #питониста #python

Machinelearning