Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

Pythonの可変長引数を徹底解説


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20220223062918p:plain

おはようございます。Shotaです。

今回の記事は、Pythonで使われる可変長引数について詳細に解説します。


はじめに

可変長引数とは、関数の引数の個数が予め決まっているわけではなく、任意の個数となっている引数のことを指します。Pythonでは*(アスタリスク)を使って、*args**kwargsのように表記します。

ちなみに、argskwargsのそれぞれの正式名称は以下の通りです。

  • args:arguments
  • kwargs:keyword arguments

argumentsは引数という意味です。

*args

def show_args(*args):
    print(args)

show_args(1, 3, 5)
show_args('a', 'b', 'c', 'd')
show_args('Shota', 'Nameless', True)

▼出力結果

(1, 3, 5)
('a', 'b', 'c', 'd')
('Shota', 'Nameless', True)

Pythonにおける*argsは、複数の引数をタプルとして出力します。タプルは基本的にリストと似ていますが、中に入っている要素を追加・変更や削除できません。

この関数の代わりに、以下のような関数を用意してタプルを使って表示しても結果は同じです。

def samplefunc(args):
    print(args)

t = (1, 3, 5)
samplefunc(t)
(1, 3, 5)

この自動的にタプルを出力することを利用して、以下のようなプログラムを書けます。次のプログラムは、可変長引数*argsにある引数全ての積を出力します。

def multiply(*args):
    z = 1
    for number in args:
        z *= number
    print(z)

multiply(2, 7)
multiply(4, 7, 19)
multiply(13, 11, 23, 31)

▼出力結果

14
532
101959

このように*argsを活用することで、関数内でキーワード以外の様々な引数を受け付けるより柔軟なコードを作成できます。あと、*argsを実際にプログラムで使う時はアスタリスクを必ず前につけてください。アスタリスクがないと可変長引数として認識されないでの要注意。

あと、引数の名前はargsと書かれていますが、名前は何でもかまいません。(第三者がプログラムを読める範囲までは)

**kwargs

**kwargsは、簡単に言えばキーワード付きの可変長引数の辞書を関数に渡すために出力されます。*argsと同様に、**kwargsはいくつでも引数を受け取れます。しかし、*argsとは異なってキーワードを割り当てる必要があります。

以下のようにして可変長引数**kwargsを出力できます。

def print_kwargs(**kwargs):
    print(kwargs)

# 「キー=値」と表記して出力させる。逆にこう書かなければエラーが発生する
print_kwargs(val_1='Kento', val_2=10, val_3=True, val_4=100)

▼出力結果

{'val_1': 'Kento', 'val_2': 10, 'val_3': True, 'val_4': 100}

あと、辞書として出力されるのを利用してこんな書き方もできます。

def show_goods(**kwargs):
    for key, value in kwargs.items():
        print(f'Item: {key}, Price: ${value}')

show_goods(
    apple=10,
    banana=15,
    natto=1,
    wheat=20,
    juice=4,
    cheese=5,
    cake=2,
    cookie=4
)

▼出力結果

Item: apple, Price: $10
Item: banana, Price: $15
Item: natto, Price: $1
Item: wheat, Price: $20
Item: juice, Price: $4
Item: cheese, Price: $5
Item: cake, Price: $2
Item: cookie, Price: $4

補足

これまで*args**kwargsをそれぞれ詳細に解説しました。実は、これらの引数は同時に扱うことができます。

def show_values(val, *args, **kwargs):
    print(val, args, kwargs)

show_values('Shota', 'student', 21, sex='male', job='developer')

▼出力結果

Shota ('student', 21) {'sex': 'male', 'job': 'developer'}

ただし、関数で可変長引数を扱う場合は「引数→可変長引数(*args)→可変長引数(**kwargs)」の順番を遵守してください。この順番が守られていないとSyntaxErrorが発生します。

あと、*args**kwargsは関数の出力でもよく利用されます。

def some_args(arg_1, arg_2, arg_3):
    print(f'arg_1: {arg_1}')
    print(f'arg_2: {arg_2}')
    print(f'arg_3: {arg_3}')

# NOTE: 可変長引数を扱う際に、データ型の一致をする。不一致が起こればTypeErrorが発生する
args = ('a', 'b', 'c')
some_args(*args)

▼出力結果

arg_1: a
arg_2: b
arg_3: c
def some_kwargs(kw_1, kw_2, kw_3):
    print(f'kw_1: {kw_1}')
    print(f'kw_2: {kw_2}')
    print(f'kw_3: {kw_3}')

# NOTE: 出力させる前とその後で型を一致させる。
kwargs = {
    'kw_1': 10,
    'kw_2': 100,
    'kw_3': 1000
}

some_kwargs(**kwargs)
kw_1: 10
kw_2: 100
kw_3: 1000

まとめ

今回の記事では、Pythonの可変長引数(*args**kwargs)を詳細に解説しました。

*args**kwargsを受け付ける関数は、引数リスト内の入力数が比較的少ないと予想される際に使うと良いでしょう。しかし、*args**kwargsを使う際には多少注意する必要があります。

今回の記事はこれで終了です。

参考サイト

blog.codecamp.jp

www.digitalocean.com

blog.pyq.jp

qiita.com