9.1 パラメータ vs 引数
初心者はよく「パラメータ」と「引数」という用語を混同しがちですが、それらの違いは関数型プログラミングを理解するために重要です。
パラメータは、関数定義で列挙された変数です。関数が受け取る値を指すために使用されます。関数のパラメータは、関数の本体で使用される値の「placeholder」として働きます。関数を定義するときに、パラメータを説明します。
def print_info(name, age): # name と age はパラメータ
print(f"Name: {name}, Age: {age}")
引数は、関数を呼び出すときに渡される具体的な値やデータです。引数は、関数が実行するときにパラメータの位置に代入されます。引数は、定数、変数、式、あるいは他の関数の結果である可能性があります。
print_info("Alice", 30) # "Alice" と 30 は引数
引数の種類
- 位置引数: 値はパラメータが定義された順番で渡されます。
- キーワード引数: 引数はパラメータ名を使って関数に渡され、位置引数の後であればどの順番でも構いません。
- デフォルト引数: 関数を定義するときに、パラメータにデフォルト値を設定できます。
位置引数は既に使用していますが、キーワード引数とデフォルト引数については次の講義で学びます。
Pythonにおけるパラメータと引数の違いは、関数がどのようにデータを受け取り処理するかを理解するのに役立ちます。この違いは、呼び出しの条件に柔軟に対応しやすい関数を作成するために重要で、コードをよりモジュール化し、再利用可能にします。
9.2 デフォルト値
Pythonのデフォルト引数は、関数が一つ以上のパラメータに対してあらかじめ決められた値を指定できる機能です。この機能により、関数の呼び出しはより便利で柔軟になり、毎回すべての引数を明示的に指定する必要がありません。
デフォルト引数の定義
デフォルト引数は、関数定義の中でパラメータを宣言するときに指定されます。関数呼び出し時に引数が渡されなかった場合に使用される値
を設定します:
def print_info(name, company='Unknown'):
print(f"Name: {name}, Company: {company}")
この例では、company
はデフォルト値'Unknown'を持っています。
- 関数呼び出しの簡素化: 多くのパラメータを持つ関数は、最も重要な引数だけを指定して呼び出すことができます。
- 柔軟性: 関数のコードを変更せずに、さまざまな使用シナリオに適応できます。
- コードの可読性: デフォルト値の明示はコードを自己文書化します。
重要なポイント
不変性: 引数のデフォルト値は、数値、文字列、タプルなどの不変なデータ型であるべきです。変更可能な型(リストや辞書など)を使用すると、関数呼び出し間でこれらのオブジェクトが変更され、望ましくない副作用を引き起こす可能性があります。
引数の順序: デフォルト値を持つパラメータは、関数定義内でデフォルト値を持たないパラメータの後に置かれるべきです。
例をもう一つ:
def create_user(username, is_admin=False):
if is_admin:
print(f"User {username} is an admin.")
else:
print(f"User {username} is a regular user.")
create_user("Alice") # is_admin == False
create_user("Bob", is_admin=True) # is_admin == True
create_user("Karl", True) # is_admin == True
上記の例は、デフォルト引数を使用する関数呼び出しの3つの方法を示しています。どれも動作します。
9.3 名前付きパラメータの渡し方
関数に名前付きでパラメータを渡すことにより、どの値がどの引数に渡されるかを明確にすることで、コードの可読性を向上させ、引数の順序を間違えることによるエラーの可能性を減らします。
パラメータを名前で渡すには、関数呼び出し時に特定のパラメータに値を割り当てます:
function(parameter1 = value, parameter2 = value)
この方法は、パラメータが多い関数やデフォルト値を持つパラメータを持つ関数で特に便利です。
名前付きパラメータの利点
- 明確さと可読性: パラメータ名を指定して呼び出すことで、他の開発者にとっても、以前の自分のコードに戻ってもコードが理解しやすくなります。
- 柔軟性: パラメータはどの順序でも渡すことができるので、パラメータが多いときに便利です。
- エラー回避: 関数のパラメータの順序を覚える必要がなくなり、値の間違った渡し方によるエラーの可能性が減ります。
使用例
def create_profile(name, age, job):
print(f"Name: {name}")
print(f"Age: {age}")
print(f"Job: {job}")
create_profile(name = "John", age = 28, job = "Developer")
この例では、パラメータは順序に関係なく渡されますが、それぞれに明確に値が割り当てられているため、関数の呼び出しはより柔軟で明確です。
例2:
ちなみに、すでに名前付きパラメータの渡し方に出会ったことがあると思います。print()
関数で、覚えていますか?
特徴と制約
名前で渡されるパラメータは、関数定義内に名前のないパラメータがある場合、その後に続ける必要があります。
関数呼び出しの際、同じパラメータ名を複数回使用することはできません。
名前付きパラメータの渡し方は、Pythonの強力な機能で、多くの引数やオプションの値を持つ関数を使う場合、コードを安全かつ理解しやすくします。
GO TO FULL VERSION