【Python】可変長引数(*argsと**kwargs)の使い方

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ
  • Python関数で活用する可変長引数(*args, **kwargs)の使い方を詳しく知りたい
目次

【Python】可変長引数(*args, **kwargs)

可変長引数とは、関数に対して引数の数を指定せず、引数を渡す方法になります。

Pythonの関数において、*および**と記載されている引数が可変長引数に該当します。関数定義の中でこれらを付与すると、可変(固定ではなく任意の数)の引数を指定できるようになります。

*argsと**kwargs

Python関数では、慣例として*argsおよび **kwargsという名前で記述されることが多いですが、***が先頭にあれば他の引数名にしても問題なしです。

可変長引数では、アスタリスクの数に応じて、関数内に情報伝達する形式が変化します。

*args複数の引数をタプル型として渡す
**kwrags複数のキーワード引数を辞書型として渡す

【Python実践】*args|複数の引数情報をタプル型で渡す場合

*argsのように*を付与した引数を指定すると、Python関数内では複数の引数をタプル型として受け取ることができるようになります。

可変長引数 × 計算処理

test_argsの関数例を見てみましょう。

def test_args(*args):
    print('args: ', args)
    print('データ型: ', type(args))
    print('合計: ', sum(args))
    print('最小: ', min(args))
    print('最大: ', max(args))
    
# 関数実行
test_args(2, 4, 6, 8)

# 出力イメージ
# 入力引数:  (2, 4, 6, 8)
# データ型:  <class 'tuple'>
# 合計:  20
# 最小:  2
# 最大:  8

この例では、関数実行時に指定した複数の数値をタプル形式で関数内に渡しています。

関数内には合計・最小・最大のメソッドを用意しており、渡されたタプルに対して統計処理を施しています。

可変長引数 × 繰り返し構文

こちらは指定した引数の数に応じて、繰り返し構文を実行するという関数例になります。

def loop(*args):
    for i in args:
        print(i)
    
    
# 関数実行
loop(2,3,4,5)

# 出力イメージ
# 2
# 3
# 4
# 5

可変長引数 × 位置引数

可変長引数と位置引数とうまく組み合わせて関数を作成することもできます。以下の例を見てみましょう。

後方に可変長引数を指定

def args(place, customer, *args):
    print('お店名: ', place)     # 第一引数
    print('来店客: ', customer)  # 第二引数
    print('来店日: ', args)      # 可変長引数

# 関数実行
args('居酒屋A店', '田中太郎', '2022-11-11', '2022-11-14','2023-1-1','2022-4-4')

# 出力イメージ
# お店名:  居酒屋A店
# 来店客:  田中太郎
# 来店日:  ('2022-11-11', '2022-11-14', '2023-1-1', '2022-4-4')

位置引数としてplacecustomer、可変長引数として*argsを指定した関数例になります。

関数実行時は、第一引数(place)、第二引数(customer)よりも右側に指定した引数は、タプルとして関数内に渡されるようになります。

可変長引数の位置を変更

可変長引数*argsを先頭や位置引数の間に配置することもできます。

def args(place, customer, *args, numbers):
    print('お店名: ', place)     # 第一引数
    print('来店客: ', customer)  # 第二引数
    print('来店日: ', args)      # 可変長引数
    print('来店人数: ', numbers) # 追加

# 関数実行
args('居酒屋A店', '田中太郎', '2022-11-11', '2022-11-14','2023-1-1','2022-4-4', numbers='3人来店')

# 出力イメージ
# お店名:  居酒屋A店
# 来店客:  田中太郎
# 来店日:  ('2022-11-11', '2022-11-14', '2023-1-1', '2022-4-4')
# 来店人数:  3人来店

可変長引数より右側に位置引数を指定した場合、関数実行時にその位置引数はキーワード形式引数名=値で指定する必要がでてくることに注意が必要です。

上記の例ではnumbersという位置引数が可変長引数より右側に定義されているため、関数実行時もnumbers='xxx'と指定しています。

【Python実践】**kwargs|複数のキーワード引数を辞書型で渡す場合

**kwargsのように**を付与した引数を指定すると、Python関数内では複数のキーワード引数を辞書型として受け取ることができるようになります。

キーワード引数の出力挙動

kwargs(**kwargs)という関数にkey1=value1, key2=value2,key3=value3のように複数のキーワード引数を指定し実行すると、関数内では{key1: value1, key2:value2, key3:value3}という辞書型の結果が得られます。

def kwargs(**kwargs):
    print('kwargs: ',  kwargs)
    print('データ型: ', type(kwargs))

# 関数実行
kwargs(name='BMW', price=10000000, purchased='2024-05-05')

# 出力イメージ
# kwargs:  {'name': 'BMW', 'price': 10000000, 'purchased': '2024-05-05'}
# データ型:  <class 'dict'>

**kwargs × 位置引数

キーワード引数と位置引数を組み合わせて出力結果を調整することも可能です。

def kwargs(place, customer, **kwargs):
    print('支店名: ', place)
    print('顧客名: ' , customer)
    print('詳細情報: ', kwargs)

# 関数実行
kwargs('北海道支店', '田中太郎', name='BMW', price=10000000, purchased='2024-05-05')

# 出力イメージ
# 支店名:  北海道支店
# 顧客名:  田中太郎
# 詳細情報:  {'name': 'BMW', 'price': 10000000, 'purchased': '2024-05-05'}

【参考】Pythonを活用した様々なお役立ち情報

当サイトではPythonを活用した様々なお役立ち情報を配信しています。

Pythonでできること・仕事に応用

Pythonで実現できることを知りたい」「Pythonスキルを仕事で活かしたい」方はこちら!

Python✖️AI・機械学習

Python活用の最大メリットの1つであるAI・機械学習について詳しく知りたい方はこちら!

Python✖️投資自動化(仮想通貨)

Pythonはフィンテックとの相性が良く、その中でも仮想通貨自動売買タスクは近年注目度の高い領域です。フィンテック・投資に興味がある方はこちら!

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次