Pythonで要素が1個のタプルには末尾にカンマが必要 | note.nkmk.me (original) (raw)

Pythonのイミュータブル(変更不可)なシーケンスオブジェクトであるタプル。要素数が1個のタプルや空のタプルを生成するときは注意が必要。

目次

要素数が1個のタプル

要素数が1個のタプルを生成しようとして丸括弧()の中に1つだけ要素を書くと、丸括弧()は無視されて、タプルとは見なされない。

`single_tuple_error = (10) print(single_tuple_error)

10

print(type(single_tuple_error))

<class 'int'>

`

要素数が1個のタプルを生成する場合は、末尾にカンマ,が必要。

`single_tuple = (10, ) print(single_tuple)

(10,)

print(type(single_tuple))

<class 'tuple'>

`

要素数が1個でもタプルはタプルなので、要素を取り出すにはインデックス[]で指定すればよい。

`print(single_tuple[0])

10

`

例えば、+演算子で複数のタプルを連結する場合、要素を1個追加しようとして,を忘れるとエラーになるので注意。

`# print((0, 1, 2) + (3))

TypeError: can only concatenate tuple (not "int") to tuple

print((0, 1, 2) + (3, ))

(0, 1, 2, 3)

`

タプルの丸括弧は省略可能

なぜ要素が1個のタプルにカンマ,が必要かというと、「タプルは丸括弧()に囲まれた値」ではなく「カンマ,で区切られた値」だから。

タプルを作るのはカンマであり、丸括弧ではありません。
組み込み型 - タプル型 (tuple) — Python 3.11.3 ドキュメント

丸括弧()が省略されていてもタプルとして扱われる。

`t = 0, 1, 2 print(t)

(0, 1, 2)

print(type(t))

<class 'tuple'>

`

末尾に不要なカンマ,があるとタプルと見なされてしまうので注意。

`t = 0, print(t)

(0,)

print(type(t))

<class 'tuple'>

`

空のタプル

上述のようにタプルを表すときの丸括弧()は省略可能だが、空のタプルを生成する場合は必須。

空白やカンマ,だけだとエラー(SyntaxError)になる。

`empty_tuple = () print(empty_tuple)

()

print(type(empty_tuple))

<class 'tuple'>

empty_tuple_error =

SyntaxError: invalid syntax

empty_tuple_error = ,

SyntaxError: invalid syntax

empty_tuple_error = (,)

SyntaxError: invalid syntax

`

空のタプルは引数なしのtuple()でも生成可能。

`empty_tuple = tuple() print(empty_tuple)

()

print(type(empty_tuple))

<class 'tuple'>

`

関数の引数でのタプル

構文上の曖昧さがある場合もタプルの丸括弧()が必須。

関数の引数はカンマ,で区切って指定するが、この場合は丸括弧()の有無でタプルかどうかを明示的に表す必要がある。

丸括弧()が無いとそれぞれの値がそれぞれの引数に渡され、丸括弧()で囲むとタプルとして一つの引数に渡される。

`def example(a, b): print(a, type(a)) print(b, type(b))

example(0, 1)

0 <class 'int'>

1 <class 'int'>

example((0, 1))

TypeError: example() missing 1 required positional argument: 'b'

example((0, 1), 2)

(0, 1) <class 'tuple'>

2 <class 'int'>

`

タプルに*を付けると、タプルの要素を展開して引数に渡すこともできる。

`example(*(0, 1))

0 <class 'int'>

1 <class 'int'>

`