【Python】関数の引数の書き方を解説

Pythonの関数を使うとき、引数の書き方を知っているととても便利です。

この記事では、位置引数、キーワード引数、デフォルト引数、可変長引数、引数の順序、そして引数のアンパッキングについて、初心者にもわかりやすく解説します。

具体的な例を交えながら、どのように使うのかを一緒に学んでいきましょう。

目次から探す

基本的な引数の書き方

Pythonの関数は、引数を使って外部からデータを受け取ることができます。

引数の書き方にはいくつかの種類があり、それぞれの使い方を理解することで、より柔軟で読みやすいコードを書くことができます。

ここでは、基本的な引数の書き方について解説します。

位置引数

位置引数の基本

位置引数は、関数に渡す引数の順序が重要な場合に使います。

関数を呼び出す際に、引数を指定された順序で渡す必要があります。

位置引数は、関数定義の中でその順序に従って処理されます。

例えば、以下の関数 add は2つの引数を受け取り、それらを足し合わせて結果を返します。

def add(a, b):
    return a + b

この関数を呼び出す際には、引数の順序に注意する必要があります。

位置引数の例

位置引数を使った関数の呼び出し例を見てみましょう。

result = add(3, 5)
print(result)  # 出力: 8

この例では、add関数に対して 35 という2つの引数を渡しています。

これらの引数は、関数定義の順序に従って ab にそれぞれ割り当てられます。

キーワード引数

キーワード引数の基本

キーワード引数は、引数の名前を指定して関数に値を渡す方法です。

これにより、引数の順序に依存せずに関数を呼び出すことができます。

キーワード引数を使うことで、コードの可読性が向上し、引数の順序を間違えるリスクを減らすことができます。

例えば、先ほどの add関数をキーワード引数を使って呼び出すことができます。

result = add(a=3, b=5)
print(result)  # 出力: 8

キーワード引数の例

キーワード引数を使った関数の呼び出し例を見てみましょう。

result = add(b=5, a=3)
print(result)  # 出力: 8

この例では、引数の順序を逆にしても、引数の名前を指定しているため、正しく動作します。

キーワード引数を使うことで、関数の呼び出しがより明確になり、引数の順序を気にせずに済むため、コードの可読性が向上します。

以上が、基本的な引数の書き方です。

位置引数とキーワード引数を適切に使い分けることで、より柔軟で読みやすいコードを書くことができます。

次に、デフォルト引数や可変長引数についても学んでいきましょう。

デフォルト引数

デフォルト引数は、関数を呼び出す際に引数が渡されなかった場合に使用される値を指定するためのものです。

これにより、関数の呼び出しを簡略化し、コードの可読性を向上させることができます。

デフォルト引数の基本

デフォルト引数は、関数定義の際に引数に対してデフォルト値を設定することで使用できます。

デフォルト値を設定することで、関数を呼び出す際にその引数を省略することができます。

デフォルト引数の定義方法

デフォルト引数は、関数定義の引数リストで等号(=)を使って設定します。

以下に基本的な定義方法を示します。

def greet(name="World"):
    print(f"Hello, {name}!")

この例では、name引数にデフォルト値としてWorldが設定されています。

関数greetを引数なしで呼び出すと、デフォルト値が使用されます。

デフォルト引数の例

以下に、デフォルト引数を使用した関数の例を示します。

def greet(name="World"):
    print(f"Hello, {name}!")
# 引数を指定せずに関数を呼び出す
greet()  # 出力: Hello, World!
# 引数を指定して関数を呼び出す
greet("Alice")  # 出力: Hello, Alice!

この例では、greet関数を引数なしで呼び出すと、デフォルト値のWorldが使用されます。

一方、引数を指定して呼び出すと、その引数が使用されます。

デフォルト引数の注意点

デフォルト引数を使用する際には、いくつかの注意点があります。

特に、可変オブジェクト(リストや辞書など)をデフォルト引数に使用する場合には注意が必要です。

可変オブジェクトをデフォルト引数に使う際の注意

可変オブジェクトをデフォルト引数に設定すると、関数が呼び出されるたびにそのオブジェクトが共有されるため、予期しない動作を引き起こす可能性があります。

以下に、可変オブジェクトをデフォルト引数に使用した場合の例を示します。

def add_item(item, item_list=[]):
    item_list.append(item)
    return item_list
# 関数を複数回呼び出す
print(add_item("apple"))  # 出力: ['apple']
print(add_item("banana"))  # 出力: ['apple', 'banana']
print(add_item("cherry"))  # 出力: ['apple', 'banana', 'cherry']

この例では、item_list引数にデフォルト値として空のリスト[]が設定されています。

しかし、関数が呼び出されるたびに同じリストが共有されるため、リストに追加されたアイテムが次の呼び出しでも保持されます。

この問題を回避するためには、デフォルト値としてNoneを使用し、関数内で新しいリストを作成する方法が一般的です。

def add_item(item, item_list=None):
    if item_list is None:
        item_list = []
    item_list.append(item)
    return item_list
# 関数を複数回呼び出す
print(add_item("apple"))  # 出力: ['apple']
print(add_item("banana"))  # 出力: ['banana']
print(add_item("cherry"))  # 出力: ['cherry']

この方法では、関数が呼び出されるたびに新しいリストが作成されるため、予期しない動作を防ぐことができます。

可変長引数

Pythonでは、関数に渡す引数の数が不定の場合に「可変長引数」を使用することができます。

可変長引数には、位置引数として受け取る *args と、キーワード引数として受け取る **kwargs の2種類があります。

可変長位置引数(*args)

*argsの基本

*args は、関数に渡される任意の数の位置引数をタプルとして受け取るために使用されます。

関数定義の際に、引数名の前にアスタリスク(*)を付けることで、可変長位置引数を指定します。

def sample_function(*args):
    print(args)

この関数は、任意の数の引数を受け取り、それらをタプルとして表示します。

*argsの例

以下に、*argsを使用した具体的な例を示します。

def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total
# 関数を呼び出す
result = sum_numbers(1, 2, 3, 4, 5)
print(result)  # 出力: 15

この例では、sum_numbers関数が任意の数の引数を受け取り、それらの合計を計算して返します。

引数はタプルとして受け取られるため、forループを使用して各要素にアクセスできます。

可変長キーワード引数(**kwargs)

**kwargsの基本

**kwargs は、関数に渡される任意の数のキーワード引数を辞書として受け取るために使用されます。

関数定義の際に、引数名の前にダブルアスタリスク(**)を付けることで、可変長キーワード引数を指定します。

def sample_function(**kwargs):
    print(kwargs)

この関数は、任意の数のキーワード引数を受け取り、それらを辞書として表示します。

**kwargsの例

以下に、**kwargsを使用した具体的な例を示します。

def print_user_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
# 関数を呼び出す
print_user_info(name="Alice", age=30, city="Tokyo")
# 出力:
# name: Alice
# age: 30
# city: Tokyo

この例では、print_user_info関数が任意の数のキーワード引数を受け取り、それらを辞書として処理します。

forループを使用して辞書の各キーと値にアクセスし、それらを表示します。

可変長引数を使用することで、関数の柔軟性が大幅に向上し、さまざまな数の引数を受け取ることができるようになります。

これにより、関数の再利用性が高まり、コードの保守性も向上します。

引数の順序

Pythonの関数定義において、引数の順序は非常に重要です。

正しい順序で引数を定義しないと、関数が正しく動作しないか、エラーが発生することがあります。

ここでは、引数の順序に関する基本的なルールと具体例を解説します。

引数の順序のルール

Pythonでは、関数の引数を以下の順序で定義する必要があります:

  1. 位置引数
  2. デフォルト引数
  3. 可変長位置引数(*args)
  4. キーワード引数
  5. 可変長キーワード引数(**kwargs)

この順序を守ることで、関数の引数が正しく解釈され、意図した通りに動作します。

位置引数、キーワード引数、デフォルト引数、可変長引数の順序

位置引数は関数呼び出し時に順番に渡される引数です。

デフォルト引数は、関数定義時にデフォルト値を設定する引数です。

可変長位置引数(*args)は、任意の数の位置引数をタプルとして受け取ります。

キーワード引数は、関数呼び出し時に名前で指定する引数です。

可変長キーワード引数(**kwargs)は、任意の数のキーワード引数を辞書として受け取ります。

引数の順序の例

以下に、引数の順序を守った関数定義の例を示します。

def example_function(arg1, arg2, default_arg='default', *args, kwarg1, kwarg2, **kwargs):
    print(f"arg1: {arg1}")
    print(f"arg2: {arg2}")
    print(f"default_arg: {default_arg}")
    print(f"args: {args}")
    print(f"kwarg1: {kwarg1}")
    print(f"kwarg2: {kwarg2}")
    print(f"kwargs: {kwargs}")
# 関数の呼び出し例
example_function(1, 2, 3, 4, 5, kwarg1='a', kwarg2='b', extra1='x', extra2='y')

この関数定義では、位置引数、デフォルト引数、可変長位置引数、キーワード引数、可変長キーワード引数の順序が守られています。

正しい順序の例

以下に、引数の順序が正しい関数定義とその呼び出し例を示します。

def correct_order(arg1, arg2, default_arg='default', *args, kwarg1, kwarg2, **kwargs):
    print(f"arg1: {arg1}")
    print(f"arg2: {arg2}")
    print(f"default_arg: {default_arg}")
    print(f"args: {args}")
    print(f"kwarg1: {kwarg1}")
    print(f"kwarg2: {kwarg2}")
    print(f"kwargs: {kwargs}")
# 関数の呼び出し例
correct_order(1, 2, 3, 4, 5, kwarg1='a', kwarg2='b', extra1='x', extra2='y')

この例では、引数の順序が正しいため、関数は正しく動作します。

間違った順序の例

以下に、引数の順序が間違っている関数定義とその呼び出し例を示します。

def incorrect_order(arg1, default_arg='default', arg2, *args, kwarg1, kwarg2, **kwargs):
    print(f"arg1: {arg1}")
    print(f"arg2: {arg2}")
    print(f"default_arg: {default_arg}")
    print(f"args: {args}")
    print(f"kwarg1: {kwarg1}")
    print(f"kwarg2: {kwarg2}")
    print(f"kwargs: {kwargs}")
# 関数の呼び出し例
incorrect_order(1, 2, 3, 4, 5, kwarg1='a', kwarg2='b', extra1='x', extra2='y')

この例では、デフォルト引数が位置引数の前に定義されているため、SyntaxErrorが発生します。

SyntaxError: non-default argument follows default argument

このように、引数の順序を守らないとエラーが発生するため、正しい順序で引数を定義することが重要です。

引数のアンパッキング

Pythonでは、関数に引数を渡す際にリストやタプル、辞書をアンパッキングして渡すことができます。

これにより、コードがより簡潔で読みやすくなります。

リストやタプルのアンパッキング

リストやタプルのアンパッキングの基本

リストやタプルのアンパッキングは、*(アスタリスク)を使って行います。

これにより、リストやタプルの要素を個別の引数として関数に渡すことができます。

リストやタプルのアンパッキングの例

以下に、リストやタプルのアンパッキングの具体例を示します。

def greet(name, age, city):
    print(f"こんにちは、{name}さん!{age}歳で、{city}に住んでいますね。")
# リストのアンパッキング
person_info_list = ["太郎", 25, "東京"]
greet(*person_info_list)
# 出力: こんにちは、太郎さん!25歳で、東京に住んでいますね。
# タプルのアンパッキング
person_info_tuple = ("花子", 30, "大阪")
greet(*person_info_tuple)
# 出力: こんにちは、花子さん!30歳で、大阪に住んでいますね。

このように、リストやタプルの要素を個別の引数として関数に渡すことができます。

辞書のアンパッキング

辞書のアンパッキングの基本

辞書のアンパッキングは、**(ダブルアスタリスク)を使って行います。

これにより、辞書のキーと値をキーワード引数として関数に渡すことができます。

辞書のアンパッキングの例

以下に、辞書のアンパッキングの具体例を示します。

def greet(name, age, city):
    print(f"こんにちは、{name}さん!{age}歳で、{city}に住んでいますね。")
# 辞書のアンパッキング
person_info_dict = {"name": "次郎", "age": 20, "city": "名古屋"}
greet(**person_info_dict)
# 出力: こんにちは、次郎さん!20歳で、名古屋に住んでいますね。

このように、辞書のキーと値をキーワード引数として関数に渡すことができます。

リストやタプル、辞書のアンパッキングを使うことで、関数に引数を渡す際のコードがより簡潔で読みやすくなります。

これらのテクニックを活用して、効率的なコードを書いてみてください。

目次から探す