2008-09-03 4 views
36

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

ответ

44
  • Кортежи используются всякий раз, когда вы хотите вернуть несколько результатов из функции.
  • Поскольку они неизменяемы, они могут использоваться как ключи для словаря (списки не могут).
+2

Из привередливых перспектив человека PL: Python является приравнивая множественный вещи здесь; в статически типизированном языке тип «кортеж» соответствует значениям, содержащим фиксированное количество под-значений с фиксированными типами. E.G., (string * int), тип кортежей, содержащих строку и целое число. На динамически типизированном языке этот смысл кажется погруженным. Понятие неизменности не является тем, что обычно связано с кортежами; Кажется, что python кооптировал и повторно накладывал термин «кортеж». – 2010-06-19 20:23:24

+0

Кортежи также возвращаются некоторыми объектами коллекции, такими как enumerate(), где полезно знание кортежей – Murphy 2016-04-01 20:34:57

2

Я считаю их полезными, когда вы всегда имеете дело с двумя или более объектами в качестве набора.

1

В списке всегда можно заменить кортеж по функциональности (за исключением, по-видимому, ключей в dict). Однако кортеж может ускорить работу. То же самое верно для, например, неизменяемых строк в Java - когда вам когда-нибудь понадобится изменить свои строки? Никогда!

Я только что прочитал приличную дискуссию о том, как ограничить то, что вы можете сделать, чтобы создавать лучшие программы; Why Why Functional Programming Matters Matters

18

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

a = {} 
a[(1,2,"bob")] = "hello!" 
a[("Hello","en-US")] = "Hi There!" 

Я использовал эту функцию прежде всего для создания словаря с ключами, которые являются координатами вершин сетки. Однако в моем конкретном случае точное сравнение используемых поплавков работало нормально, что может быть не всегда верно для ваших целей [в этом случае я, вероятно, конвертировал бы ваши поплавки в какое-то целое число с фиксированной запятой]

1

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

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

2

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

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

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

8

Мне нравится this explanation.

В принципе, вы должны использовать кортежи, если существует постоянная структура (1-я позиция всегда содержит один тип значения, второй - и т. Д.), А списки должны использоваться для списков однородных значений.

Конечно, всегда есть исключения, но это хорошая общая рекомендация.

0

В дополнение к местам, где они синтаксически требуются, например, операция string% и для нескольких возвращаемых значений, я использую кортежи как форму легких классов. Например, предположим, что у вас есть объект, который передает непрозрачный файл cookie вызывающему из одного метода, который затем передается другому методу. Кортеж - это хороший способ упаковать несколько значений в этот файл cookie без необходимости определять отдельный класс, чтобы их содержать.

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

0

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

Кортеж представляет собой разделенный запятыми список значений:

t = 'p', 'q', 'r', 's', 't' 

это хорошая практика, чтобы заключить кортежи в скобках:

t = ('p', 'q', 'r', 's', 't') 
Смежные вопросы