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 в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.