CodeGym /Javaコース /Python SELF JA /関数パラメータの高度な操作

関数パラメータの高度な操作

Python SELF JA
レベル 14 , レッスン 3
使用可能

7.1 関数のすべての引数を取得する

Pythonには、関数内から渡されたすべてのパラメータのリストを取得するための便利な方法がいくつかあります。さあ、それを見ていきましょう。

*argsの使用法

*argsは、関数に変数数の位置(通常)の引数を渡すことを可能にします。これらの引数はタプルにパックされ、関数内で処理できます。


def print_numbers(*args):
    for arg in args:
        print(arg)
        
print_numbers(1, 2, 3, 4, 5)

説明

関数print_numbersは、タプルargsにパックされた任意の数の位置引数を受け取ります。関数内でforループを使って引数を反復処理できます。

利点

  • 柔軟性: 任意の数の引数を関数に渡すことができます。
  • 汎用性: パラメータ数が不定の関数に使用できます。

**kwargsの使用法

**kwargsは、関数に変数数の名付けられた引数を渡すことを可能にします。これらの引数は辞書にパックされ、関数内で処理できます。


def print_person_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
        
print_person_info(name="Alice", age=30, city="New York")

説明

関数print_person_infoは辞書kwargsにパックされた任意の数の名付けられた引数を受け取ります。辞書のitems()メソッドを使って引数を反復処理できます。

利点

  • 柔軟性: 任意の数の名付けられた引数を関数に渡すことができます。
  • 読みやすさ: 名付けられた引数は関数の呼び出しをより読みやすくします。

7.2 引数の型を固定する

位置引数のみ

Python 3.8以降では、位置指定によってのみ渡すことができる位置引数を持つ関数を定義できます。これは、関数定義で/記号を使って行います。


def greet(name, /, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # 出力: Hello, Alice!
greet("Alice", greeting="Hi")  # 出力: Hi, Alice!
# greet(name="Alice")  # エラー: TypeError

説明

関数greetは、位置指定でのみ渡すことができるname引数を受け取ります。引数 /より前の 引数は位置指定のみ可能です。

こうしたアプローチは、引数の渡し方を制限し、可読性を向上させ、エラーを防ぎます。

名付けられた引数のみ(Keyword-Only Arguments)

また、名前でのみ渡すことができる関数のパラメータを定義することもできます。これは、関数定義で*記号を使って行います。


def greet(*, name, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet(name="Alice")  # 出力: Hello, Alice!
greet(name="Alice", greeting="Hi")  # 出力: Hi, Alice!
# greet("Alice")  # エラー: TypeError

関数greetは、名前でのみ渡すことができるname引数を受け取ります。引数 *の後 引数は名前でのみ渡せます

このアプローチは、引数の名前を明示的に指定することを強制し、コードの可読性を向上させます。

位置引数と名付けられた引数の組み合わせ

また、最大限の柔軟性を得るために、位置引数と名前付き引数を組み合わせることができます。


def greet(name, /, *, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # 出力: Hello, Alice!
greet("Alice", greeting="Hi")  # 出力: Hi, Alice!
# greet(name="Alice")  # エラー: TypeError

関数greetは、位置指定でのみ渡すことができるname引数を受け取り、名前付き引数greetingも必ず名前を指定して渡す必要があります。/*を使用することで、位置引数と名前付き引数の組み合わせが可能です。

すべての状況の完全な例:


def full_example(a, b, /, c, d, *, e, f):
    print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
        
# 様々な引数での関数呼び出し
full_example(1, 2, 3, 4, e=5, f=6)  # すべての引数が正しく渡されました
# full_example(a=1, b=2, c=3, d=4, e=5, f=6)  # エラー: TypeError

説明

  • 位置指定のみの引数: abは位置指定でのみ渡せます。
  • 通常の位置または名付けられた引数: cdは位置または名前で渡せます。
  • 名前付きのみの引数: efは名前でのみ渡せます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION