Краткость — сестра таланта: 5 примеров лаконичного кода на Python

Написание кода в одну строчку на Python уменьшает головную боль

Python славится своей простотой и удобством использования. Это достигается, в том числе, за счет компактности кода. При том за такой лаконичностью может скрываться сложная программная логика. В этой статье рассмотрим 5 примеров «синтаксического сахара» для обработки последовательностей, когда встроенные конструкции языка программирования позволяют писать меньше и проще.

Напомним, последовательностью называется итеративная структура данных или просто массив элементов. В Python чаще всего используются такие последовательности, как список (list), строка (str), кортеж (tuple), словарь (dict) или множество (set).

1. Создаем списки в одну строчку с помощью List comprehension

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

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

В результате имеем:

>>> result
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Обратите внимание, range — это последовательность чисел от 0 до 10 (не включительно), а «**» — оператор возведения в степень. Теперь сделаем то же самое, воспользовавшись синтаксическим сахаром – конструкцией List comprehension [1]:

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

Получим тот же самый результат:

>>> result
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

List comprehension можно использовать и для вложенных циклов. Например, требуется составить всевозможные пары элементов из двух списков. Классический способ:

first = ['a1', 'a2']; second = ['b1', 'b2']
result = []
for i in first:
    for j in second :
        pair = (i, j)
        result.append(pair)

А теперь коротко, в Python-стиле:

result = [(i,j) for i in first for j in second]

Вот так с List comprehension можно сократить процесс создания списка с 5 строчек до 1.

2. Создаем словари с помощью Dict comprehension

Задача — создать словарь, у которого значение (value) соответствует квадрату ключа (key). Классический способ требует создания пустого словаря и цикла с поэлементным отображением ключа и значения на следующей строке:

result = {}
for x in range(10):
   result[x] = x**2

А результат все тот же:

>>> result
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

Обратите внимание, после х стоит двоеточие, разделяя ключ и его значение. Аналогично List comprehension, Dict comprehension можно использовать для вложенных циклов.

3. Удаляем дубликаты из списка

Допустим, в списке имеются повторяющиеся элементы, а вам нужны только уникальные значения. Что делать? Можно создать новый список, а в цикле устроить проверку на соответствие элемента новому списку:

fruits = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
new = []
for fruit in fruits:
    if fruit not in new:
        new.append(fruit)

В результате:

>>> new
['banana', 'apple', 'pear', 'orange']

Как видим, apple и orange больше не повторяются. В 5-й строчке мы проверяем нахождение элемента в новом списке: если есть, то добавляем, иначе – игнорируем. И даже эту простую конструкцию можно сократить, преобразовав список в множество:

new = set(fruits)
>>> new
['banana', 'apple', 'pear', 'orange']

Множество – это такая структура данных, в которых каждый элемент является уникальным. Поэтому, когда вам нужно исключить дублирующиеся данные, используйте множества — set.

4. Распаковываем элементы из списка

Если вам нужно вытащить из последовательности определенные значения, можно присвоить переменную каждому элементу в этой последовательности:

x, y = (15, 5)

Результат:

>>> x
15
>>> y
5

После этого можно использовать х и y как отдельные переменные. Аналогично с распаковкой вложенных последовательностей:

fruit, num, date = ['apple', 5,(2020, 10, 1)]

Вывод даты:

>>> date
(2020, 10, 1)

Чтобы получать соответствующие значения, можно напрямую обращаться к индексам списка, например, fruits[2]. Такой метод используется для извлечения только одного элемента из списка.

5. Режем списки в Python

В предыдущем примере мы распаковывали каждый элемент из списка. А что, если требуется извлечь подсписок? Например, имеется последовательность из 5 элементов, необходимо взять только 3 из них. Это в Python тоже предусмотрено:

x = [1, 2, 3, 4, 5]
result = x[:3]
>>> result
[1, 2, 3]

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

sequence[start:stop:step]

Параметры списка sequence таковы:

  • start – индекс, с которого какого индекса начать выделение подсписка;
  • stop – индекс, на котором нужно остановиться;
  • step – шаг продвижения по списку.

Например, следующая конструкция:

x = [10, 5, 13, 4, 12, 43, 7, 8]
result = x[1:6:2]

Вернет нам:

>>> result
[5, 4, 43]

Здесь был взят срез списка x, начиная с 1-го элемента и заканчивая 6-м (не включительно), с шагом 2. Заметим, индексирование в Python начинается с 0.

 

Теперь, зная синтаксический сахар в Python и как его эффективно применять, вы можете смело назваться питонистом. В следующей статье мы расскажем о генераторах и итераторах: что это такое и чем они полезны. Еще больше подробностей о том, как самостоятельно писать простой и лаконичный код, вы узнаете на практических курсах по Python в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.

Источники
  1. https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

Добавить комментарий

Поиск по сайту