Представление кортежей (tuple comprehension) – это нечто, чего в Python попросту не существует. Однако, его можно имитировать, запустив генераторное выражение внутри вызова функции tuple()
. Например:
numbers = [1, 2, 3, 4, 5] # 'Представление кортежей' squares = tuple(x**2 for x in numbers) print(squares) # Результат: # (1, 4, 9, 16, 25)
В этой статье мы разберем, как имитировать представление кортежей. Вы узнаете, что такое генераторное выражение и как с ним работает функция tuple()
. Кроме того, мы расскажем, почему не следует использовать представление кортежей, если вы заботитесь о производительности вашего кода.
Итак, приступим!
Имитация представления кортежей
В Python представления кортежей нет. Однако синтаксически существует близкая альтернатива!
Чтобы создать кортеж с синтаксисом, напоминающим представление кортежей в Python, можно поместить выражение генератора внутри вызова функции tuple()
.
values = tuple(elem for elem in iterable)
Во введении мы уже привели подобный пример, а теперь давайте подробнее рассмотрим, как это работает.
1. Что такое генераторное выражение в Python?
В Python генераторное выражение — это краткий способ создания объекта генератора. Это похоже на представление списков, но вместо списка создается генератор. О представлениях списков можно почитать в статье “List comprehensions и другие comprehensions в Python”.
Генератор — это итератор, который генерирует значения на лету вместо того, чтобы сохранять их в памяти. Это делает его более эффективным, особенно при работе с большими коллекциями данных.
Вот пример генераторного выражения:
# Создать генератор, который будет генерировать квадраты чисел от 1 до 10 squares = (x**2 for x in range(1, 11))
Чтобы использовать значения генератора, его можно перебрать при помощи цикла for
.
for square in squares: print(square)
Результат:
1 4 9 16 25 36 49 64 81 100
Кроме того, можно использовать встроенную функцию next()
для вызова следующего значения в последовательности генератора. Например:
# Сгенерировать квадраты от 1 до 10 squares = (x**2 for x in range(1, 11)) # Вывести первые 5 квадратов for i in range(5): print(next(squares))
Результат:
1 4 9 16 25
Заметим, что квадраты чисел вычисляются на лету, а не хранятся в памяти. Благодаря этому данное выражение можно использовать для генерации квадратов до бесконечности, не испытывая проблем с памятью.
2. Что собой представляет функция tuple() в Python?
В Python функция tuple()
используется для создания кортежа или для преобразования любой итерируемой последовательности в кортеж.
Кортеж — это последовательность значений, которая не может быть изменена. Это неизменяемый встроенный тип данных.
Кортежи похожи на списки, но они обычно используются для других задач. В то время как список используется для хранения набора связанных между собой элементов, кортеж используется для хранения фиксированного количества элементов, которые могут быть между собой не связаны.
Вот пример создания кортежа из списка при помощи функции tuple()
:
# Создать кортеж из трех элементов my_tuple = tuple([1, 2, 3]) # Вывести кортеж print(my_tuple) # Результат: # (1, 2, 3)
Функция tuple()
принимает последовательность (например, список) в качестве аргумента и возвращает кортеж с теми же элементами. Это может быть полезно, если вы хотите преобразовать другой итерируемый объект в кортеж.
3. Функция tuple() + выражение генератора
Теперь, когда вы получили представление о генераторном выражении и функции tuple()
, у вас есть ключи к пониманию того, как работает представление кортежей.
Давайте рассмотрим пример из начала статьи:
numbers = [1, 2, 3, 4, 5] # 'Представление кортежей' squares = tuple(x**2 for x in numbers) print(squares) # Результат: # (1, 4, 9, 16, 25)
Здесь результат выражения x**2 for x in numbers
является генератором. Он похож на любой другой итерируемый объект в Python. Вы можете перебирать его элементы или преобразовывать их во что-то еще, например, в список или кортеж.
Функция tuple()
превращает генератор в кортеж его значений.
Не используйте представление кортежей
Если вас беспокоит производительность, использовать представление кортежей не следует.
Если вам нужно создать кортеж таким образом, чтобы это напоминало представление (списков, словарей или множеств), лучше всего:
- Создать представление списков
- Преобразовать его в кортеж
Это даст самый быстрый результат.
Чтобы убедиться в этом, давайте проведем небольшое соревнование по производительности, создав представление кортежей разными способами. Вы можете запустить сами все эти команды из командной строки.
1. Представление списков
python3 -m timeit 'l = [i for i in range(1000)]'
Результат:
20000 loops, best of 5: 13.6 usec per loop
2. Кортеж из представления списков
python3 -m timeit 'l = tuple([i for i in range(1000)])'
Результат:
20000 loops, best of 5: 14.8 usec per loop
3. Кортеж из генератора
python3 -m timeit 'l = tuple(i for i in range(1000))'
Результат:
10000 loops, best of 5: 20.7 usec per loop
4. Кортеж, созданный при помощи синтаксиса распаковки
python3 -m timeit 'l = *(i for i in range(1000)),'
Результат:
10000 loops, best of 5: 21.8 usec per loop
Как можно заметить, второй подход самый быстрый.
Другими словами, чтобы в Python использовать представление кортежей, просто создайте список при помощи представления списков и преобразуйте этот список в кортеж при помощи функции tuple()
.
Заключение
Итак, теперь вы знаете, что в Python представления кортежей не существует. Но его можно имитировать и получить синтаксически похожий результат при помощи функции tuple()
и генераторного выражения.
Спасибо за чтение и удачного кодинга!
Перевод статьи Artturi Jalli “Python Tuple Comprehension: Step-by-Step Guide (Examples)”.
Пингбэк: List comprehensions и другие comprehensions в Python