Tuple z pojedynczym elementem w Pythonie wymagają przecinka po przecinku

Biznes

Tuple, które są niezmiennymi (niezmiennymi) obiektami sekwencyjnymi w języku Python.

Należy zachować ostrożność podczas generowania krotek z jednym elementem lub krotek pustych.

Opisano tu następujące szczegóły.

  • Tuple z 1 elementem
  • Można pominąć nawiasy okrągłe tupli.
  • Pusta krotka
  • Tuple w argumentach funkcji

Tuple z 1 elementem

Jeśli spróbujesz wygenerować tuple z jednym elementem i zapiszesz tylko jeden obiekt wewnątrz nawiasów okrągłych (), nawiasy okrągłe () zostaną zignorowane i przetworzone i nie będą traktowane jako tuple.

single_tuple_error = (0)

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

Przecinek po przecinku jest wymagany do wygenerowania krotki z jednym elementem.

single_tuple = (0, )

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

Na przykład podczas używania operatora + do łączenia wielu krotek należy pamiętać, że jeśli spróbujesz dodać jeden element i zapomnisz o przecinku, otrzymasz błąd.

# print((0, 1, 2) + (3))
# TypeError: can only concatenate tuple (not "int") to tuple

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

Można pominąć nawiasy okrągłe tupli.

Powodem, dla którego tuple z jednym elementem wymagają przecinka, jest to, że tuple nie są wartościami ujętymi w nawiasy okrągłe (), lecz wartościami oddzielonymi przecinkiem.

To przecinek tworzy tuple, a nie nawiasy okrągłe.
Tuples — Built-in Types — Python 3.10.4 Documentation

Nawet jeśli pominięto nawiasy okrągłe (), jest on przetwarzany jako tuple.

t = 0, 1, 2

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

Należy pamiętać, że niepotrzebny przecinek po obiekcie jest traktowany jako tuple.

t_ = 0,

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

Pusta krotka

Jak wspomniano powyżej, nawiasy okrągłe () można pominąć przy reprezentowaniu krotki, ale są one wymagane przy generowaniu krotki pustej.

Sama spacja lub przecinek spowoduje wystąpienie błędu składniowego (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

Puste krotki mogą być również generowane przez funkcję tuple() bez argumentów.

empty_tuple = tuple()

print(empty_tuple)
print(type(empty_tuple))
# ()
# <class 'tuple'>

Tuple w argumentach funkcji

Nawiasy okrągłe () są wymagane nawet w przypadku niejednoznaczności składniowej.

Argumenty funkcji są oddzielane przecinkami, ale w tym przypadku konieczne jest wyraźne wskazanie, czy funkcja jest tuplem, czy nie, poprzez obecność lub brak nawiasów okrągłych ().

Bez nawiasów (), każda wartość jest przekazywana do każdego argumentu; z nawiasami (), każda wartość jest przekazywana jako tuple do jednego argumentu.

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'>

Jeśli krotka jest oznaczona gwiazdką *, to jej elementy można interpretować i przekazywać jako argumenty.

example(*(0, 1))
# 0 <class 'int'>
# 1 <class 'int'>

Więcej informacji na ten temat można znaleźć w poniższym artykule.