note.nkmk.me

Pythonで要素が1個のタプルには末尾にカンマが必要

Date: 2018-03-18 / tags: Python

Pythonのイミュータブル(変更不可)なシーケンスオブジェクトであるタプル。

要素数が1個のタプルや空のタプルを生成するときは注意が必要。

ここでは以下の内容について説明する。

  • 要素数が1個のタプル
  • タプルの丸括弧は省略可能
  • 空のタプル
  • 関数の引数でのタプル
スポンサーリンク

要素数が1個のタプル

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

single_tuple_error = (0)

print(single_tuple_error)
print(type(single_tuple_error))
# 0
# <class 'int'>

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

single_tuple = (0, )

print(single_tuple)
print(type(single_tuple))
# (0,)
# <class 'tuple'>

例えば、+演算子で複数のタプルを連結する場合、要素を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個のタプルにカンマ,が必要かというと、「タプルは丸括弧()に囲まれた値」ではなく「カンマ,で区切られた値」だから。

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

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

t = 0, 1, 2

print(t)
print(type(t))
# (0, 1, 2)
# <class 'tuple'>

オブジェクトのあとに不要なカンマ,があるとタプルと見なされてしまうので注意。

t_ = 0,

print(t_)
print(type(t_))
# (0,)
# <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'>

詳細は以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事