Published on

Pythonの*argsとタプルについて

Authors
  • avatar
    Name
    Kikusan
    Twitter

結局のところタプルってなんなんってところをまとめます。

タプルとは

基本的には内容の変更ができないリストのことだと思っていい。 注意点

  • タプルに入れたオブジェクトは中身の変更が可能
  • () で宣言だが、ただカンマで区切っただけでもタプルとして認識される

サンプルコードを見ると理解が早かった。

t = (1, 2, 3)
# t[0] = 0 変更できない(appendもできない)

# オブジェクトを入れて中身を変更はできる
t = (1, [1, 2])
t[1][0] = 0
print(t) # (1, [0, 2])

t = 1, 2, 3 # カンマ区切りでタプルと認識される
print(type(t)) # <class 'tuple'>
# (1) はただの数値なので注意。タプルにしたいなら(1,)

# タプルのパッキング
t = (1, 2, 3)
# タプルのアンパッキング
x, y, z = t
print(x, y, z) # 1 2 3

# 入れ替えもtmpなしでできる
x, y = y, x
print(x, y) # 2 1

*argsとは

上記を踏まえて、可変引数をタプルで受け取る方法だと思っていい。

  • はなにかというと、タプルをアンパッキング or パッキング して関数の引数に 渡す or 受け取る ことができるただの書き方だった。

これもサンプルコードを見ると理解が早かった。

# タプルは残りの引数、辞書はキーワード引数
def menu(food, *args, **kwargs):
    print(f'food: {food}')
    print(f'args: {args}')
    for a in args:
        print(a)
    print(f'kwargs: {kwargs}')
    for k, v in kwargs.items():
        print(k, '=', v)

menu('banana', 'apple', 'orange', entree='beef', drink='coffee')
# food: banana
# args: ('apple', 'orange')
# apple
# orange
# kwargs: {'entree': 'beef', 'drink': 'coffee'}
# entree = beef
# drink = coffee

# これをタプルと辞書を* ** を使って書く
t = ('apple', 'orange')
d = {'entree': 'beef', 'drink': 'coffee'}
menu('banana', *t, **d)
# 出力は上と同じ

# ちなみに* ** を使わないと *argsに認識されちゃうよね
menu('banana', t, d)
# food: banana
# args: (('apple', 'orange'), {'entree': 'beef', 'drink': 'coffee'})
# ('apple', 'orange')
# {'entree': 'beef', 'drink': 'coffee'}
# kwargs: {}

勢いあまってdictもやってしまったがやっていることは同じだった。