このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】関数の位置引数

関数の位置引数

 関数の位置引数とは、関数定義時に記述した仮引数の順序と、実際に関数を呼び出すときに渡す実引数の順序が一致している必要がある引数のことです。位置引数を正しく利用することで、関数は期待通りの動作をし、誤ったデータが渡されるのを防ぐことができます。
 ここでは、位置引数の基本的な概念、関数定義と呼び出しにおける引数の順序の重要性、そしてイテラブルアンパッキングやキーワード引数との組み合わせについて、具体例や表を使って解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.位置引数の基本概念

1.1. 基本構文と役割

 関数を定義する際に、仮引数を位置に沿って記述します。位置引数は、関数呼び出し時に渡される実引数が、定義された順番に対応して割り当てられるため、順序が非常に重要です。基本的な構文は次のようになります。

def order(main, side, drink):
    print('main :', main)
    print('side :', side)
    print('drink:', drink)

解説

  • def order(main, side, drink): で関数 order を定義し、仮引数 mainsidedrink の順に記述します。
  • 関数呼び出し時に実引数が渡されると、最初の値が main に、次の値が side に、最後の値が drink に対応します。
  • 例えば、order('pizza', 'soup', 'juice') と呼び出すと、実行結果は次のようになります。
order('pizza', 'soup', 'juice')

実行結果

main : pizza
side : soup
drink: juice

1.2. 仮引数と実引数の順序の重要性

 位置引数では、関数定義時の仮引数の順序と、呼び出し時の実引数の順序が必ず一致しなければなりません。順序が入れ替わると、意図しない値が各仮引数に割り当てられ、正しい処理が行われなくなります。

定義時の仮引数の順序呼び出し時の実引数の順序結果例
main, side, drink'pizza', 'soup', 'juice'main: pizza, side: soup, drink: juice
main, side, drink'soup', 'pizza', 'juice'main: soup, side: pizza, drink: juice

解説

  • 表の例では、実引数の順序が変わると、関数内部での値の割り当ても変わることが示されています。
  • 位置引数は、順序が正しくないとバグの原因になるため、呼び出し時には注意が必要です。

2.イテラブルアンパッキングによる位置引数の活用

2.1. イテラブルアンパッキングの基本

 位置引数には、リストやタプルなどのイテラブルなオブジェクトをアンパックして渡すことができます。アンパッキングは、先頭にアスタリスク(*)を付けることで行います。

snack = ['hotcake', 'fruit', 'tea']
order(*snack)

解説

  • *snack と記述することで、リスト snack の各要素が、定義された順に位置引数として展開されます。
  • この場合、hotcakemain に、fruitside に、teadrink に対応し、出力は次のようになります。
main : hotcake
side : fruit
drink: tea

2.2. 部分的なアンパッキングと追加の実引数

 イテラブルアンパッキングと通常の実引数を混在させることも可能です。位置引数として渡すものは必ず先頭に記述し、キーワード引数または追加の実引数はその後に記述します。

snack = ['hotcake', 'fruit']
order(*snack, 'tea')

実行結果

main : hotcake
side : fruit
drink: tea

解説

  • この呼び出しでは、リスト snack の要素 hotcakefruit が、順番に mainside に割り当てられ、追加の実引数 'tea'drink に対応します。
  • 結果は、先ほどの例と同様に正しい順序で値が渡されます。

3.キーワード引数との比較と併用

3.1. キーワード引数の特徴

 キーワード引数は、実引数を「引数名=値」という形式で指定できるため、仮引数の順序に依存せずに関数を呼び出すことが可能です。

order(main='steak', side='salad', drink='coffee')

実行結果

main : steak
side : salad
drink: coffee

解説

  • この呼び出しでは、実引数の順序が任意になり、各値が指定された仮引数に確実に割り当てられます。
  • 複雑な関数呼び出しでは、位置引数とキーワード引数を混在させる際に、位置引数を先に、キーワード引数を後に書く必要があります。

3.2. 混合呼び出し例

 位置引数、イテラブルアンパッキング、辞書アンパッキング、キーワード引数を組み合わせる場合、以下の規則に従います。「位置引数またはイテラブルアンパッキングを先に、キーワード引数または辞書アンパッキングを後に記述する」必要があります。

order('hamburger', *['fruit'], **{'drink': 'coke'})

実行結果

main : hamburger
side : fruit
drink: coke

解説

  • 'hamburger' は位置引数として main に割り当てられ、リスト ['fruit'] がアンパックされて side に、辞書 {'drink': 'coke'} がアンパックされて drink に割り当てられます。
  • このように複数の形式を組み合わせることで、柔軟で可読性の高い関数呼び出しが可能になります。

【表:位置引数とキーワード引数の使い分け】

種類記述方法特徴
位置引数order('pizza', 'soup', 'juice')仮引数の定義順に実引数が割り当てられる。
イテラブルアンパッキングorder(*snack)リストやタプルなどの各要素を順に展開して渡す。
キーワード引数order(main='steak', side='salad', drink='coffee')引数名に基づいて値が割り当てられるため、順序が自由。
辞書アンパッキングorder(**dessert)辞書からキーと値のペアをキーワード引数として展開して渡す。
混合呼び出しorder('hamburger', *['fruit'], drink='coke')位置引数やアンパッキングとキーワード引数を組み合わせ可能。

まとめ

 関数の位置引数は、関数定義時に指定された仮引数の順序に従って実引数が割り当てられるため、呼び出し時の実引数の順序が非常に重要です。

  • 基本概念: 関数定義時の仮引数の順序と、関数呼び出し時の実引数の順序が一致しなければならず、これにより正確な値の割り当てが行われます。
  • イテラブルアンパッキング: リストやタプルを展開して位置引数として渡すことができ、コードの柔軟性が向上します。
  • キーワード引数との併用: キーワード引数を使用すれば、仮引数の順序に依存せずに実引数を渡すことができ、位置引数と混在する場合は位置引数を先に記述する必要があります。

 これらの知識を活用して、関数呼び出し時の引数の順序を正確に管理し、再利用性が高く、保守性に優れたプログラムを作成できるようにしましょう。