Всіх вітаю! У цій статті ми розглянемо принцип list comprehension у Python та як успішно використовувати його замість більш довгих відрізків коду.
Теоретичний огляд
Що таке list comprehension?
Це принцип, за яким ви можете записати реалізацію деяких циклів та конструкцій усього в один рядок, замість умовних чотирьох чи п’яти, як більшість звикла робити.
Часто цей принцип можна помітити у коді, і він може здатися ідеальним, але насправді в нього є як переваги, так і відверті недоліки.
В чому переваги list comprehension?
Очевидною перевагою цього підходу є стислість, яка допомагає писати набагато менше коду і при цьому отримувати ідентичний результат.
Які недоліки list comprehension?
На початку вам може здатися, що list comprehension є універсальним підходом для створення циклів та інших довгих конструкцій, але через це в нього є і деякі недоліки.
Головним недоліком такого підходу є складність читання коду. Іноді через вкрай часте застосування list comprehension може призвести до погіршення читабельності вашого коду, так як у різних ситуаціях цей підхід може мати доволі нечіткий вигляд.
У цій статті ми розглянемо легкі приклади, щоб дати базове розуміння про list comprehension, тому всі приклади будуть читатися достатньо легко і не вимушено, але в реальних проєктах ця конструкція часто може мати набагато складніший вигляд.
Тим не менш, питання, як, де і коли використовувати list comprehension залишається за вами. Сам підхід у жодному разі не є поганим, але потрібно в усьому знати міру.
Використання з циклом for
Звичаний код
Напишемо звичайний код без list comprehension:
for i in range(11):
print(i)Результат:
0
1
2
3
4
5
6
7
8
9
10Застосування list comprehensions

Спершу розглянемо шаблон конструкції list comprehension.
Тут exp є скороченням від expression і означає вираз — це саме та змінна i, яку ми використовуємо у циклі for. Після цієї змінної нам потрібно записати сам цикл for і на цьому все.
Тепер запишемо попередній код, але вже використовуючи конструкцію list comprehension:
one_line = [i for i in range(11)]
print(one_line)Результат:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]Як бачимо, код працює згідно з першим шаблоном.
Застосування list comprehension з умовами
Тільки if

Тепер наш минулий шаблон дещо змінився, бо до нього додалася умова if, що фільтруватиме результат. Надалі, якщо ви використовуєте лише if — вам потрібно буде записати конструкцію list comprehension за цим шаблоном.
Ось як виглядає звичайний код:
for i in range(11):
if i % 2 == 0:
print(i)Результат:
0
2
4
6
8
10Напишемо той самий код за допомогою list comprehension:
one_line = [i for i in range(11) if i % 2 == 0]
print(one_line)Результати:
[0, 2, 4, 6, 8, 10]Повна конструкція if-else

Станом на зараз ми розглянули запис умови лише за допомогою ключового слова if, не вказавши else. Проте важливо показати і приклад з використанням повної конструкції if-else.
На цьому моменті варто звернути увагу на третій шаблон, бо використання саме повноцінної конструкції if-else значно змінює порядок елементів у конструкції list comprehension.
Спочатку додамо else у код без list comprehension:
for i in range(11):
if i % 2 == 0:
print(i)
else:
print("-")Результат:
0
-
2
-
4
-
6
-
8
-
10Тепер спробуємо записати повну конструкцію if-else у list comprehension:
one_line = [i if i % 2 == 0 else "-" for i in range(11)]
print(one_line)Результат:
[0, '-', 2, '-', 4, '-', 6, '-', 8, '-', 10]Отже, код за третім шаблоном працює абсолютно правильно.
Висновок
У підсумку ми обговорили основні переваги та недоліки list comprehension і навчилися використовувати його практично, пам’ятаючи головні шаблони, за якими необхідно записувати цю конструкцію.
Всім дякую за увагу!