Рубрики
Без рубрики

Зацикливаться или не зацикливаться

«Код читается чаще, чем он написан» Гвидо Ван … Tagged With Python, Python3, учебник, Codequality.

” Код читается чаще, чем он написан ” Гвидо Ван Россум (создатель Python)

Сохраняйте эту мысль в глубине души, когда вы проходите эту статью.

Рассмотрим следующий пример: у нас есть список игроков, с их именем и страной, и мы хотим извлечь всех индийских игроков.

players = [{'name': 'P V Sindhu', 'country': 'India'},
           {'name': 'Michael Phelps', 'country': 'USA'},
           {'name': 'Usain Bolt', 'country': 'Jamaica'},
           {'name': 'Manika Batra', 'country': 'India'}]

indian_players = []
for player in players:
  if player['country'] == 'India':
    indian_players.append(player)

Теперь, в приведенном выше коде, каждая строка легко понята, но вы должны кэшировать четыре строки в мозге, чтобы понять весь контекст.

indian_players = [player for player in players if player['country'] == 'India']

Используя Понимание списка Мы можем написать более выразимый код. Приведенный выше код также не нарушает ITM [ Я Nitialize T курица M odify] antipattern, где переменная инициализируется сначала, а затем модифицируется сразу после, как мы это сделали в первом примере.

Петля, если петля, правильная петля

Python предоставляет несколько хороших абстракций по конструкции цикла, что делает код более выраженным.

Доступ к элементам в списке:

Плохой ❌

names = ['P V Sindhu', 'Usain Bolt', 'Michael Phelps', 'Manika Batra']

for i in range(len(names)):
  print(names[i])

Хорошо ✔

for name in names:
  print(name)

Но что, если требуются индексы? 🤔

for i in range(len(names)):
   print(i+1, names[i]) 

Нет! ❌

Лучший путь ✔

for idx, name in enumerate(names, start=1):
  print(idx, name)

Теперь, почему второй код лучше? Во -первых, использование индексов создает уровень косвенности. Если требуется значение, зачем беспокоиться о индексе?

Во -вторых, что если имена не был список но Словарь , или какая -то другая структура данных, где индексация невозможна? В этом случае первый код потерпит неудачу, поскольку мы индексируем в коллекции, но второй все равно будет работать правильно.

Общее правило, если вы используете индексы для итерации, Python, возможно, уже обеспечил для него более лучшие абстракции.

Еще несколько примеров

Итерация над ключами и ценностями в словаре:

turing_award_winners = {1966: 'Alan Perlis', 
                        1967: 'Maurice Wilkes',
                        1968: 'Richard Hamming',
                        1969: 'Marvin Minsky'}

for year in turing_award_winners:
  print(year, turing_award_winners[year])

Получение года, а затем поиск имени в словаре снова вызывает уровень косвенности.

Вместо:

for year, name in turing_award_winners.items():
  print(year, name)

Это также дает четкое значение.

Не петля

Много раз, цикл не следует рассматривать вообще. Рассмотрим простой пример поиска суммы всех чисел в списке.

Общепринятый:

nums = [1, 5, 11, 17, 23, 29]

ans = 0
for num in nums:
  ans += num

Вместо:

ans = sum(nums)

Код передает идею, что Анс содержит сумму всех чисел в списке Nums , и также очень кратко.

Вывод

Напишите более выразимый код, используя различные конструкции, которые может предложить язык. Избегайте необработанных петлей, когда можете.

Я настоятельно рекомендую посмотреть видео ниже.

Дальнейшие часы:

Оригинал: “https://dev.to/geekypandey/to-loop-or-not-to-loop-4phb”