Skip to content

Latest commit

 

History

History
89 lines (66 loc) · 3.76 KB

comprehensions.md

File metadata and controls

89 lines (66 loc) · 3.76 KB

Абстракции списков

Абстракция списков (списковое включение или генерация списков) это та особенность Python, которой мне будет очень сильно недоставать, если я сменю язык программирования. Абстракции списков это конструкторы, позволяющие создавать последовательности из других последовательностей. В Python (2 и 3) есть три типа подобных абстракции:

  • абстракции списков
  • абстракции словарей
  • абстракции множеств

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

list абстракции

Абстракции списков открывают доступ к простому и лаконичному синтаксису генерации списков. Конструкция состоит из квадратных скобок содержащих выражение и оператор for, плюс дополнительные for или if при необходимости. Выражения могут быть любыми, т.е. вам разрешается иметь любые элементы внутри списка. Результатом работы будет новый список после исполнения выражения с оглядкой на for и if.

Шаблон использования:

variable = [out_exp for out_exp in input_list if out_exp == 2]

Вот короткий пример:

multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)
# Вывод: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

Такой синтаксис может быть очень удобен для быстрого создания списков. Некоторые разработчики предпочитают такой подход использованию функции filter. Особенно хорошо абстракции списков заменяют создание нового простого списка при помощи цикла for и append. Наглядный пример:

squared = []
for x in range(10):
    squared.append(x**2)

Вы можете сократить решение до одной строки:

squared = [x**2 for x in range(10)]

dict абстракции

Абстракции словарей используются схожим образом. Вот пример, на который я недавно наткнулся:

mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

mcase_frequency = {
    k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
    for k in mcase.keys()
}

# mcase_frequency == {'a': 17, 'z': 3, 'b': 34}

В примере выше мы суммируем значения ключей, которые отличаются только регистром. Лично я редко пользуюсь этим методом. Вы также можете легко поменять местами ключи и значения в словаре:

{v: k for k, v in some_dict.items()}

set абстракции

Абстракции множеств схожи с абстракциями списков. Единственное различие - используются фигурные скобки {}. Вот пример:

squared = {x**2 for x in [1, 1, 2]}
print(squared)
# Вывод: {1, 4}