” Код читается чаще, чем он написан ” Гвидо Ван Россум (создатель 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
, и также очень кратко.
Вывод
Напишите более выразимый код, используя различные конструкции, которые может предложить язык. Избегайте необработанных петлей, когда можете.
Я настоятельно рекомендую посмотреть видео ниже.
Дальнейшие часы:
- Петля, как уроженец: в то время как, итераторы, генераторы Нед Батчелдер.
- Красивый рефакторинг питона Конор Хокстра.
- C ++ приправа Шон Родитель.
Оригинал: “https://dev.to/geekypandey/to-loop-or-not-to-loop-4phb”