ホームページ > バックエンド開発 > Python チュートリアル > Python の *args と **kwargs を理解する

Python の *args と **kwargs を理解する

Linda Hamilton
リリース: 2024-11-01 06:53:31
オリジナル
553 人が閲覧しました

Understanding Python

Python はそのシンプルさと柔軟性で有名であり、多くの場合、可変数の引数を持つ関数を処理できることからもたらされます。

2 つの特殊シンボル *args と **kwargs は、この柔軟性において極めて重要な役割を果たします。

この記事では、これらのシンボルの意味、使用方法、そしてなぜそれらが非常に強力なのかを探っていきます。


*args の基本

*args パラメーターを使用すると、関数は任意の数の位置引数を受け入れることができます。

アスタリスク (*) は、すべての位置引数をタプルに収集する必要があるという Python への信号です。

*args の動作例

def greet(*args):
    for name in args:
        print(f"Hello, {name}!")

greet('Alice', 'Bob', 'Charlie')

ログイン後にコピー
ログイン後にコピー

出力:

Hello, Alice!
Hello, Bob!
Hello, Charlie!

ログイン後にコピー
ログイン後にコピー

説明:

  • 関数greetは、任意の数の位置引数を受け入れます。
  • 関数内の args は、渡されたすべての引数を含むタプルです。
  • 引数を反復処理して、各名前の挨拶を出力します。

*args について初めて学んだとき、ビデオ ゲームの新しいレベルのロックを解除するような気分でした。関数の定義が非常に簡単になりました。


**クワーグに飛び込む

同様に、**kwargs を使用すると、関数は任意の数のキーワード引数を受け入れることができます。

二重アスタリスク (**) は、すべてのキーワード引数を辞書に収集するように Python に指示します。

**kwargs の動作例

def display_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

display_info(name='Alice', age=30, city='New York')

ログイン後にコピー
ログイン後にコピー

出力:

name: Alice
age: 30
city: New York

ログイン後にコピー
ログイン後にコピー

説明:

  • 関数 display_info は、任意の数のキーワード引数を受け入れます。
  • 関数内では、kwargs はすべてのキーワード引数を含む辞書です。
  • kwargs.items() を反復処理して、各キーと値のペアを出力します。

**kwargs の使用は、名前付きパラメーターの柔軟なセットを必要とする関数を扱う場合に命を救ってくれます。これにより、コードがクリーンで整理された状態に保たれます。


*args と **kwargs の組み合わせ

同じ関数内で *args と **kwargs の両方を使用して、すべての種類の引数を受け入れることができます。

併用例

def make_sentence(*args, **kwargs):
    sentence = ' '.join(args)
    for key, value in kwargs.items():
        sentence += f" {key} {value}"
    print(sentence)

make_sentence('I', 'love', 'Python', exclamation='!', emoji='?')

ログイン後にコピー
ログイン後にコピー

出力:

I love Python exclamation ! emoji ?

ログイン後にコピー
ログイン後にコピー

説明:

  • args は、位置引数をタプルに収集します。
  • *kwargs はキーワード引数を辞書に収集します。
  • 位置引数を結合し、キーワード引数を追加することで文を構築します。

*args と **kwargs を混ぜると、適切な材料をすべて使って料理するような気分になります。皿を壊すことなく、好みに応じてレシピを調整できます。


パラメータの順序

*args と **kwargs を使用する場合、関数定義内でそれらを配置する順序が重要になります。

  1. 通常の位置引数
  2. 引数
  3. キーワード引数 (デフォルト値のない引数)
  4. デフォルト値を持つキーワード引数
  5. *クワーグス

正しい注文例

def greet(*args):
    for name in args:
        print(f"Hello, {name}!")

greet('Alice', 'Bob', 'Charlie')

ログイン後にコピー
ログイン後にコピー

間違った注文例

Hello, Alice!
Hello, Bob!
Hello, Charlie!

ログイン後にコピー
ログイン後にコピー

私はこの注文で、認めたくないほど何度もつまずいてきました。パラメーターの順序を再確認すると、デバッグ時間を大幅に節約できます!


* と ** を使用した引数のアンパック

アスタリスクは関数定義だけでなく、関数を呼び出すときにも役立ちます。

シーケンスと辞書を引数に解凍できます。

開梱例

def display_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

display_info(name='Alice', age=30, city='New York')

ログイン後にコピー
ログイン後にコピー

出力:

name: Alice
age: 30
city: New York

ログイン後にコピー
ログイン後にコピー

説明:

  • 数値はタプルを位置引数に解凍します。
  • *詳細は、辞書をキーワード引数に解凍します。

この機能により、特にリストや辞書に自然に含まれるデータを扱う場合に、コードが非常にクリーンになりました。


実用的な用途

柔軟な機能インターフェイス

関数のシグネチャを変更せずに、関数でさまざまな数の入力を処理したい場合。

def make_sentence(*args, **kwargs):
    sentence = ' '.join(args)
    for key, value in kwargs.items():
        sentence += f" {key} {value}"
    print(sentence)

make_sentence('I', 'love', 'Python', exclamation='!', emoji='?')

ログイン後にコピー
ログイン後にコピー

デコレータとラッパー

デコレータを作成するとき、ラップされた関数が受け取る引数の数がわからないことがよくあります。

I love Python exclamation ! emoji ?

ログイン後にコピー
ログイン後にコピー

デコレーターは Python で私のお気に入りの機能の 1 つであり、*args と **kwargs によってそれが可能になります。


避けるべきよくある間違い

パラメータの配置が間違っています: *args と **kwargs が関数シグネチャに正しく配置されていることを確認してください。

使いすぎ: *args と **kwargs は強力ですが、使いすぎるとコードが理解しにくくなる可能性があります。

アスタリスクは忘れてください: args と kwargs は単なる慣例であることを思い出してください。アスタリスク (*、**) が特別な理由です。

def func(a, b, *args, **kwargs):
    pass

ログイン後にコピー

バランスが重要です。どこでも *args と **kwargs を使用したくなりますが、場合によっては明示的なパラメーターの方が明確になることがあります。


結論

*args と **kwargs を理解すると、Python プログラミングの可能性が広がります。

これらは、任意の数の引数を処理できる関数を作成する柔軟性を提供し、コードをより動的で適応性のあるものにします。

*args と **kwargs をマスターすることは、私の Python の旅のターニングポイントでした。

これにより、コーディングがより楽しくなり、プログラムがより堅牢になりました。これらの機能をまだ試していない場合は、ぜひ試してみることを強くお勧めします。

以上がPython の *args と **kwargs を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート