• en
  • Language: ru
  • Documentation version: latest

16. Постижения

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

  • понимания списков

  • словарные толкования

  • понимания множеств

  • понимания генераторов

Мы будем обсуждать их по очереди. Как только вы освоите использование list осмыслений, вы сможете легко использовать любой из них.

16.1. list постижения

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

Блюпринт

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

Вот небольшой пример:

multiples = [i for i in range(30) if i % 3 == 0]
print(multiples)
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

Это может быть действительно полезно для быстрого создания списков. Некоторые даже предпочитают использовать его вместо функции filter. Понимание списков действительно сияет, когда вы хотите передать список методу или функции для создания нового списка путем добавления к нему в каждой итерации цикла for. Например, вы обычно делаете что-то вроде этого:

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

Вы можете упростить его с помощью понимания списков. Например:

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

16.2. 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}

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

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

16.3. set постижения

Они также похожи на списки. Единственное отличие заключается в том, что в них используются скобки {}. Вот пример:

squared = {x**2 for x in [1, 1, 2]}
print(squared)
# Output: {1, 4}

16.4. generator постижения

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

multiples_gen = (i for i in range(30) if i % 3 == 0)
print(multiples_gen)
# Output: <generator object <genexpr> at 0x7fdaa8e407d8>
for x in multiples_gen:
  print(x)
  # Outputs numbers