Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで任意の個数の引数を受け取る関数を作成する方法(*argsと**kwargsの使い方)

問題

任意の個数の入力引数を受け取ることができる関数を書きたい場合があります。

解決策

Pythonでは、* を付けた引数を使用することで、任意の個数の引数を受け取ることができます。ここでは、「2つ以上の与えられた数値の平均を求める」という例を通じてその仕組みを理解しましょう。

以下の例では、rest_arg は、呼び出し時に渡された残りのすべての引数(この場合は数値)を格納するタプルになります。関数はこれらの引数を1つのシーケンスとして扱い、平均値の計算を行います。

# 与えられた数値の平均を求めるサンプル関数
def define_average(first_arg, *rest_arg):
    average = (first_arg + sum(rest_arg)) / (1 + len(rest_arg))
    print(f"Output \n *** The average for the given numbers {average}")

# 2つの数値で関数を呼び出す
define_average(1, 2)

出力

*** The average for the given numbers 1.5

次に、より多くの数値を渡して同じ関数を呼び出してみます。

# より多くの数値で関数を呼び出す
define_average(1, 2, 3, 4)

出力

*** The average for the given numbers 2.5

このように、引数の個数が変わっても同じ関数を柔軟に使い回せるのが * 引数の利点です。

任意の個数のキーワード引数を受け取る(**kwargs)

任意の個数のキーワード引数を受け取りたい場合は、** で始まる引数名を使用します。

def player_stats(player_name, player_country, **player_titles):
    print(f"Output \n*** Type of player_titles - {type(player_titles)}")
    titles = ' AND '.join('{} : {}'.format(key, value) for key, value in player_titles.items())

    print(f"*** Type of titles post conversion - {type(titles)}")
    stats = 'The player - {name} from {country} has {titles}'.format(name=player_name,
                                                                     country=player_country,
                                                                     titles=titles)
    return stats

player_stats('Roger Federer', 'Switzerland', Grandslams=20, ATP=103)

出力

*** Type of player_titles - <class 'dict'>
*** Type of titles post conversion - <class 'str'>
'The player - Roger Federer from Switzerland has Grandslams : 20 AND ATP : 103'

上記の例では、player_titles は、渡されたキーワード引数をすべて保持する辞書(dict)として機能しています。その後、join() メソッドによって文字列へ変換され、最終的な統計情報が組み立てられています。

* と ** を組み合わせる

位置引数とキーワード引数の両方を任意の個数だけ受け取れる関数を作りたい場合は、*** を組み合わせて使用します。

def func_anyargs(*args, **kwargs):
    print(args)    # タプルとして受け取る
    print(kwargs)  # 辞書として受け取る

この関数では、渡されたすべての位置引数はタプル args に格納され、すべてのキーワード引数は辞書 kwargs に格納されます。このパターンは、ラッパー関数やデコレータなど、引数の中身を事前に特定できない汎用的な関数を実装する際によく使われる定番テクニックです。

  1. Pythonで乱数を生成する方法を徹底解説!randomモジュールの基本と使い方

    Pythonの標準ライブラリには、乱数を生成するための機能がまとめられた random モジュールが用意されています。このモジュールを利用することで、浮動小数点数や整数の乱数、シーケンスからのランダムな要素の取得などを簡単に実現できます。ここでは、よく使われる主要な関数をサンプルコードとともに紹介します。random():0以上1未満の浮動小数点数を生成もっとも基本的な関数が random() です。この関数は、0以上1未満の範囲のランダムな浮動小数点数を返します。>>> import random>>> random.random()0.520470277

  2. Python関数の引数の数を取得する方法【inspectモジュール活用】

    Python関数の引数の数を調べるには? たとえば、次のようなスクリプト qux.py があるとします。 #qux.py def aMethod1(arg1, arg2): pass def aMethod2(arg1, arg2, arg3, arg4, arg5): pass このスクリプトの中身が分からない(ソースコードにアクセスできない)場合でも、Pythonの標準ライブラリである inspect モジュールを使えば、関数が受け取る引数の数や名前を簡単に調べることができます。 inspectモジュールで引数の一覧を取得する まず、inspect モジュールをインポー