位置引数とキーワード引数

Pythonでプログラミングする際、関数を定義および呼び出すときに、位置引数、キーワード引数、またはその両方を使用することができます。これらの引数を使用することで、コードの可読性と柔軟性を高めることができます。

位置引数

位置引数とは、関数に適切な順序で渡す必要がある引数です。ここでは、フルネームを生成するシンプルな関数を作成する例を示します:

def full_name(first_name, last_name):
    return f'{first_name} {last_name}'  # 名と姓を結合する

print(full_name('Anna', 'Brown'))       # 'Anna Brown' と表示される

上の例では、Anna が最初の引数で、Brown が2番目の引数です。もし引数の順序を逆にすると、異なる結果が得られます:

print(full_name('Brown', 'Anna'))       # 'Brown Anna' と表示される

キーワード引数

これに対し、キーワード引数を使用すると、関数に引数を渡すときに引数名を指定することができ、コードの可読性を高めることができます。さらに、オプションの引数に対してデフォルト値を設定するためにも使用できます。

def full_name(first_name, last_name):
    return f'{first_name} {last_name}'

print(full_name(last_name='Brown', first_name='Anna'))  # 'Anna Brown' と表示される
print(full_name(first_name='Anna', last_name='Brown'))  # 'Anna Brown' と表示される

これは、引数の順序に関係なく、最初の例と同じ出力を提供します。

もし関数呼び出しでキーワード引数が位置引数の前に使用されると、Pythonは構文エラーを発生させます。この規則は、Pythonが両者を区別するのに役立ちます。キーワード引数の後に位置引数が続くと、Pythonのインタプリタはすべての位置引数がすでに定義されていると期待するため、混乱します。こちらは SyntaxError を引き起こす誤った関数呼び出しの例です:

def greet(first_name, last_name):
    print('Hello', first_name, last_name)

greet(last_name='Doe', 'John')
# SyntaxError: positional argument follows keyword argument

この規則は、関数呼び出しを明確にし、コードを理解しやすくし、バグを減らすのに役立ちます。

位置引数とキーワード引数の組み合わせ

ミドルネームを含めたフルネームをフォーマットするこの関数を考えてみましょう:

# middle と last のデフォルト値(空の文字列)
def full_name(first, middle='', last=''):
    return first + ' ' + middle + ' ' + last

print(full_name('Anna', last='Brown'))                   # 'Anna  Brown'
print(full_name('Anna', middle='Louise', last='Brown'))  # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', last='Brown'))         # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', 'Brown'))              # 'Anna Louise Brown'
print(full_name(first='Anna', 'Louise', last='Brown'))   # SyntaxError

この例では、first は位置引数として提供され、last はキーワード引数です。middle は指定されていないため、デフォルト値(空の文字列)が使用されます。

もう一つ重要な規則は、一度キーワード引数を使用し始めたら、それ以降の引数はすべてキーワード引数でなければならないということです。例えば、print(full_name(first='Anna', 'Louise', last='Brown')) はエラーを発生させます。なぜなら、キーワード引数 (first='Anna') の後に位置引数 ('Louise') が続いているからです。

最後に、もう少し複雑な実際の例を考えてみましょう。税金と割引のオプションパラメータを持つ、購入の合計金額を計算する関数です。

# 税と割引のデフォルト値は0に設定されている
def calculate_total_cost(price, tax=0.0, discount=0.0):
    return price + price * tax - discount

print(calculate_total_cost(100, tax=0.05))                # 105.0
print(calculate_total_cost(100, discount=10))             # 90.0
print(calculate_total_cost(100, tax=0.05, discount=10))   # 95.0

この場合、price は必須の位置引数ですが、taxdiscount はオプションのキーワード引数です。提供されない場合、それらはデフォルト値の0になります。

To check your solution you need to sign in

Sign in to continue

Sign in to your account

By continuing, you agree to our Terms of Service and Privacy Policy.