タプル
出典: フリー百科事典『ウィキペディア(Wikipedia)』
タプル (tuple、「トゥープル」と発音されることもある) は、集合理論において、ひとつの値に複数の属性を持たせたものをさす。
- リレーショナルデータベース におけるタプルとは、(FIXME)
- Pythonにおけるタプル (以下で説明)
[編集] コンピュータサイエンスにおけるタプル
コンピュータサイエンスではタプルは3つの異なった意味を持つことができる。そして、通常、関数や他のプログラミング言語ではtupleは数学のtupleと同様に数個のオブジェクトを持っているデータオブジェクトである。また、そのようなオブジェクトはレコードとして知られている。
Eiffelには、ビルトインにタプルの概念がある。型
TUPLE [X, Y, Z]
にはそれの値として最初が型X、二番目が型Y、三番目が型Zの3つ以上のタプルの要素があります。これはタグを使って以下のようにも書くことができる。
TUPLE [tag1: X, tag2: Y, tag3: Z]
戻り値の型に依存しない。例えば
[x1, y1, z1]
はx1の型はXなどと実際に型に対応するタプルはブラケット記法で書かれている。If t is such a tuple, its elements can be accessed, in the form using tags, as t.tag1 etc.; they can also be set in the same way, as in t.tag2 := y2 which replaces the second element, of type Y, by y2. A value of type TUPLE [X, Y, Z] can be assigned to a variable of the same type but also to one of type TUPLE [X, Y], or TUPLE [X], or just TUPLE which covers all tuples. This is thanks to the definition that TUPLE [X, Y], for example, covers sequences of at least (rather than exactly) two elements, with the first two of the types given. Tuple types fit well in an object-oriented context, where they save writing a class when all you need is simple sequences of values with associated access and set mechanisms for each field.
In some languages, and especially in database theory, a tuple is defined as a finite function that maps field names to a certain value. Its purpose is the same as in mathematics, namely to indicate that a certain entity or object consists of certain components and/or has certain properties, but here these components are identified by a unique field name and not by a position, which often leads to a more user-friendly notation. The general term for this construct is an associative array; other programming languages have yet other names for the concept.
A small example of a tuple would be:
( player : "Harry", score : 25 )
which is a function that maps the field name "player" to the string "Harry" and the field name "score" to the number 25. Note that the order of the components is not relevant, so the same tuple can also be written as:
( score : 25, player : "Harry" )
In the relational model such tuples are typically used to represent a single proposition; in this case there exists a player with the name "Harry" and a score of 25.
プログラミング言語でタプルはデータ構造を形成するのに使用される。例えば以下のは二重に繋がっているリスト(doubly linked list)の中のノードを表す構造であるかもしれない。
( value : 16, previous-node : 1174782, next-node : 1174791 )
[編集] プログラミング言語Pythonにおけるタプル
Pythonにおけるタプルとは、いくつかの値 (数値型、文字列型など)をひとつにまとめて、あたかもひとつの値のように扱う機能である。カッコで複数の値をまとめるという見た目が似ているのでよくリストや配列と混同されるが、タプルは目的が異なっており、リストや配列が同質のものをまとめるのに対し、タプルは用途や型が異なるものをひとつにまとめるために使われる。
このタプルの働きは、C言語の構造体に似ている。構造体には通常異なる型や名前をもった値がまとめて格納される。これによって、本来ならばひとつの値しか扱えない箇所 (関数の返り値や、変数への代入、配列の各要素など) で複数の値を同時に扱うことが可能になる。Python のタプルはこの構造体を匿名にしたようなものと考えることができる。たとえば ('A', 1)
という 2つの要素 (文字列および整数) からなるタプルを考えてみよう。タプルは、ひとつの「かたまり」として変数に代入できる:
x = ('A', 1)
また、タプルはリスト内の単一の要素として代入・追加・削除ができる。
s = [('A', 1), ('C', 3), ('E', 9)] # 「2要素のタプル」からなる 3要素のリスト s[0] = ('B', 2) # リストの最初の要素を変更する del s[0] # リストの最初の要素を削除する
さらに、タプルは関数の返り値として使うこともできる。これによって、複数の値を返す関数を実現することができる。
def func(): return ('A', 1) x = func() # x には ('A', 1) が入る
C や Java のような言語では、上のような関数は構造体あるいはインスタンスオブジェクトを返すように設計しなければならない。しかしタプルを使えば、複数の値をまとめたオブジェクトをその場で作成して返すことができる。もっとも、Python ではリストもその場で作成できるため返り値として使うことができるが、タプルを使って値を返すことにより、「つねに決まった個数の値を返す」という意図を表すことができる。
タプルはリストと同様に、個々の要素を添え字によって参照できる。この機能が、よくリストと混同されるゆえんである。しかしタプルでは以下のような構文によって、個々の要素をそれぞれ別々の変数に“分解”することができる。
def func(): return ('A', 1) (p,q) = func() # p には 'A' が、q には 1 が入る
しかし C の構造体とは違い、タプルはあくまで「ひとつの値」であるため、一度構築したら中の値を変更することができない。
x = ('A', 1) x[0] = 'B' # エラー
タプルの値を変更する場合は、一度分解してから再構築する必要がある:
x = ('A', 1) (p,q) = x # 分解 x = ('B', q) # タプルを再構築
Python のタプルが変更不能になっているのには理由がある。それはタプルを辞書型のキーとして使うためには、キーの不変性を保証しなければならないからである。