Рубрики
Без рубрики

Окончательное руководство к кортежам Python

Python имеет несколько встроенных структур данных, такие как списки, наборы и словари (проверьте статьи!). В этой статье вы узнаете все, что вам нужно знать о кортежах, включая реальные примеры мира. Пример мотивации кортежа У вас когда-либо имел функцию, с которой вы хотели вернуть несколько ценностей? Скажи, у вас есть функция Translate (Text, Target_Language) … Окончательное руководство к кортежем Python Подробнее »

Автор оригинала: Lukas.

Python имеет несколько встроенных структур данных, таких как списки, наборы и словари (проверьте статьи!). В этой статье вы узнаете все, что вам нужно знать о кортежах, включая реальные мировые примеры.

Пример мотивации кортежа

У вас когда-нибудь была функция, из которой вы хотели вернуть несколько ценностей?

Скажи, у вас есть функция Перевести (текст, target_language) Это ожидает двух аргументов. Первый – это текст быть переведенным в виде строкового значения, а второй – это target_language код как строка, к которой должен быть переведен вход.

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

  • переведенный текст и
  • Цена доверия, показывающая предполагаемое качество результата.

Теперь, как мы можем вернуть оба значения одновременно?

Очень распространенное решение состоит в том, чтобы принять объект результата одним атрибутом для каждого значения. Вы должны сначала определить этот объект. В зависимости от контекста вашей программы это может быть хорошей идеей. Однако в Python есть намного проще вариант – кортежи Действительно

видео

Нет времени читать? Смотреть видео!

Характеристики кортежей

Структура данных кортежей является встроенной структурой данных языка Python со следующими характеристиками:

  • Кортежи – это Контейнеры , вы можете хранить данные в них. Документация Python определяет контейнер в качестве объекта, который реализует метод __sontains__ Отказ Другими словами, контейнер – это то, что вы можете использовать в Оператор на. Другие примеры контейнеров в Python являются список, Dict, Set или Frozenset. Коллекция модуля содержит больше типов контейнеров.
  • Кортежи – это заказал Каждый элемент имеет свое положение или, наоборот, позиция имеет значение.
  • Кортежи – это считать Таким образом, вы можете использовать их, например, в контуре для цикла.
  • Кортежи – это неизменный Это означает, что вы не можете изменить кортеж после его создания. Как только кортеж был создан, вы не можете больше изменять. Другим примером неизменного типа данных в Python является String. Вместо этого вы не можете изменять кортежи или строки в Python, Python создает новый экземпляр с модифицированными значениями. Однако, если кортеж содержит смежные типы данных, такие как списки, элементы этих списков могут измениться! Тем не менее, ссылки в кортеже к этим спискам не могут.
  • Кортежи – это гетероген Поскольку они могут содержать элементы нескольких различных типов данных одновременно. Пример однородного типа данных – это строки, потому что они могут содержать только символы.

Синтаксис

Чтобы создать кортеж, мы помещаем некоторые запятые значения в скобках:

t1 = (1, 2, 3, 'Python')

И мы можем сделать его даже проще, скобка не требуется:

t2 = 1, 2, 3, 'Python'

Оба направления совершенно действительны и создают кортеж, содержащие четыре значения, три целых числа и одну строку. Создание кортежа также называется упаковкой. Давайте посмотрим некоторые специальные кортежи:

empty_tuple = ()
one_element_tuple = 1,

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

Операции

Для следующих примеров мы предполагаем, что S и T являются кортежими, х, я, j, k, n целых чисел.

Синтаксис Объяснение
х в т Проверьте, если кортеж T содержит значение в переменной X
х не в т Проверьте, если TUPLE T не содержит значения в переменной X.
T + S. Объединить кортежи T и S. Это создает новый кортеж, содержащий значения из T и S.
T * N. Повторите кортеж T N раз. Это создает новый кортеж, содержащий N раз все значения t.
t [я] Получить элемент по индексу I
T [I: J] Получите элементы из индекса I до index j (исключая j) как кортеж
T [I: J: K] Получите элементы из индекса i до index j (исключая j), принимая каждый k-й элемент как кортеж
Лен (т) Возвращает длину кортежа
мин (т) Возвращает наименьший элемент кортежа
Макс (т) Возвращает самый большой элемент кортежа
t.count (x) Возвращает количество вхождений X в кортеже

Попробуй сам:

Практическое упражнение : Что произойдет, если вы попытаетесь назначить ценность в кортеже? ( например T [0] )

Распаковывать кортежи

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

my_tuple = (1, 2, 3, 4, 5)

one = my_tuple[0]
two = my_tuple[1]
three = my_tuple[2]
four = my_tuple[3]
five = my_tuple[4]

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

my_tuple = (1, 2, 3, 4, 5)

one, two, three, four, five = my_tuple

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

Иногда нам не нужны все значения из кортежа. Например, скажем, нам нужны только первые два и последнее значение из нашего кортежа. Опять же, мы могли бы сделать это, используя индексы, тем не менее, есть более питоновый путь. Это называется продленным распаковкой, позвольте мне показать вам, как это работает:

my_tuple = (1, 2, 3, 4, 5)

one, *_, four, five = my_tuple

Как вы можете видеть, мы отметили переменную под названием _ (подчеркивает) с звездочка Отказ Во-первых, это означает, что «Все остальные» идет к этой переменной.

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

Другое интересное здесь – это имя переменной _ (подчеркивание). Хотя это не имеет ничего общего, особенно с кортежами, это общее соглашение в Python, чтобы позвонить в пустышку или выбросить переменную, как это. Поскольку в примере мы хотели получить только первые и два последних значения, вызовите переменную, содержащую оставшиеся значения _. Итак, когда другие программисты читают код, который они понимают, что мы не заботимся о тех оставшихся ценностях.

Когда вы используете расширенный распаковщик, вы должны быть осторожны, потому что он должен быть однозначным. Вы не можете иметь две переменные со звездочкой, поскольку это сделало бы назначение неоднозначным.

Работа с кормами

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

Передавая кортежи к функциям

Если вы хотите пройти кортеж в функции, вы должны использовать скобки.

def func(tup):
    for element in tup:
        print(element)


# call function func
func((1, 2, 3))

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

from math import sqrt

def distance(a, b):
    return sqrt(a**2 + b**2)


point2D = (5, 3)

# call function distance
distance(*point2D)

Попробуйте, что произойдет, если вы назовете функцию Расстояние () без использования звездочки перед кортежом.

Названные кортежи

До сих пор мы должны были знать, на каком положении в кортеже определенная стоимость хранится. Например, если у нас есть кортеж точка = (1,5, 98, 75, 12, 12,5) Мы должны знать, что означает каждый номер. Если вы не знаете, что элемент при индексе 0 должен быть радиусом, при индексе 1 – это красное значение, при индексе 2 зеленое значение и т. Д., Вы не сможете работать с кортежом. И когда вы создаете новый кортеж, вы должны быть осторожны с порядком ценностей, потому что их позиция дает им их значение. Вот где NamedTupes вступают в игру. Если вы хотите использовать NamedTupes Вы должны Импорт NamedTupes из коллекций . Модуль Коллекции является частью стандартной библиотеки Python.

Как использовать namedtupes

from collections import namedtuple

Person = namedtuple('Person', 'name age country')
bob = Person('Bob', 31, 'UK')

Прежде всего важно отметить, что импортированный namedtuple это функция, а не тип данных. Точнее namedtuple это классная фабрика, потому что это функция, которая создает классы. В нашем примере выше мы создали класс под названием человек, который имеет три элемента: имя, возраст и страна. Первый аргумент, который мы передали namedtuple Это наше имя класса, второй аргумент – это строка названий элементов. Вместо строки мы могли бы использовать кортеж или список имен элементов. После создания класса Человек Мы используем его, чтобы создать экземпляр человека. Если словарь здесь звучит очень оооподобное для вас, вы находитесь на правильном пути. Хотя namedtuple Действительно ли кортежи, под капотом Python создает класс.

С NamedTuple. Нам больше не нужно знать, какое значение, на каком положении, вместо этого мы можем просто получить доступ к значениям их имена, например.:

bob.name
bob.age
bob.country

Изменение NamedTupes.

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

Нарезка

Давайте предположим, что это день рождения Боба, так как мы можем обновить свою запись данных?

new_values = bob[:1] + (32, ) + bob[2:]
bob = Person(*new_values)

С нашей namedtuple Человек содержит только три значения, нарезка может показаться немного негабарированным, но показывает идею. Когда мы создаем новый NamedTuple. Мы должны снять округлый кортеж с помощью оператора звездочки, потому что конструктор человека ожидает трех отдельных аргументов, а не кортеж. Если вам не нравится оператор Asterisk, вы также можете использовать Метод _make () Создать новый экземпляр нашего namedtuple Отказ

Затем код выглядит так:

new_values = bob[:1] + (32, ) + bob[2:]
bob = Person._make(new_values)

Обновлять значения, используя _replace ()

Другой способ изменить значения в namedtuple Используя _replace () метод. Тем не менее, голым в виду, кортеж неизменен, модификация всегда означает создание нового кортежа. Если вы попробуете следующее, вы получите ошибку:

# Error!
bob.name = 'Alice'

Итак, один год спустя на его следующий день рождения Боб движется к США. Как мы обновляем наш кортеж, используя _replace () Способ сейчас? Вот так:

bob = bob._replace(age=33, country='US')

Вот и все! И не забывайте переназначение – кортежи неизменяются, на самом деле мы создаем новый кортеж!

Расширение namedtupes.

Теперь мы хотим сделать наши данные о лицах более точных. Поэтому мы хотим добавить другой элемент под названием City. Как мы можем расширить наш человек кортеж, чтобы держать четвертый элемент?

new_fields = Person._fields + ('City',)
NewPerson = namedtuple('NewPerson', new_fields)

bob = NewPerson(*bob, 'Washington')

Поскольку мы не хотим вводить названия поля нашего первоначального персонала кортеля снова, мы просто используем атрибут _Fields Чтобы получить кортеж всех имен полей. Затем мы добавляем кортеж с именами полей, которые мы хотим добавить. Далее мы создаем новый namedtuple С дополнительным полем и создать новый экземпляр BOB Living в Вашингтоне.

Приложения NamedTupes.

В некоторых случаях названные кортежи могут использоваться красиво вместо словарей, потому что они не только более легкие, чем словарь, но также можно получить доступ к значениям с точки зрения точечной обозначения вместо словаря [‘field_name’] или dictionary.get ). Очень просто преобразовывать словари к названию кортежей и названные кортежи к словарям.

Преобразование NamedTuple в словарь

Это очень легко, потому что namedTupes имеет метод для _asdict () который делает работу для вас. Итак, давайте посмотрим, как мы можем конвертировать данные старых бобов в словарь:

data_dict = bob._asdict()

Преобразование словаря к NamedTuple

Преобразование из словаря на NamedTuple также очень просто. Все, что нам нужно, это Двойной Asterisk Оператор ** на распаковку словаря. Это оставляет нас с записями словаря, которые будут использоваться в качестве параметров ключевых слов.

data = {
    'name': 'Prasanth',
    'age': 27,
    'country': 'India',
}
# Person is the same namedtuple as defined in the examples above
p = Person(**data)

Преобразовать список словарей в список NamedTupes

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

query_results = [
    {'name': 'Alice', 'age': 25, 'country': 'Spain'},
    {'name': 'Bob', 'age': 33, 'country': 'US'},
    {'name': 'Chloe', 'country': 'France'},
    {'name': 'Dagobert', 'age': 50},
]

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

def create_tuples(results):
    keys = {key for data in results for key in data.keys()}
    Person = namedtuple('Person', sorted(keys))
    Person.__new__.__defaults__ = (None, ) * len(Person._fields)
    return [Person(**data) for data in results]

# call the function
create_tuples(query_results)

Теперь мы можем очень красиво работать с данными без каких-либо проблем с несуществующими записями и гораздо меньшим кодом, чем нам потребовалось бы, если бы мы взяли список словарей.

Резюме

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

Кортеры – это контейнеры для данных, которые принадлежат вместе, такие как координаты X и Y точки в 2D пространстве.

На NamedTupes также являются кортежими Но у них есть решающее преимущество: вы можете получить доступ к элементам в кортеже по имени не только по индексу. Это позволяет легко преобразовать между NamedTuples и словарями.

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

x, *_, y = 1, 2, 3, 4
x, y = y, x

# What's the output?
print(y)

Чтобы проверить, правильно ли вы уже догадались, используйте следующую интерактивную оболочку для проверки вашего предположения:

Оригинал: “https://blog.finxter.com/the-ultimate-guide-to-python-tuples/”