コンテンツ

Pythonインタラクティブガイド - ステップ3 関数 (3) - 特殊なパラメータ

シリーズ - Pythonインタラクティブガイド
Info
  • 本講座「Pythonインタラクティブガイド」は、手を動かしながらPythonプログラミングの基礎を学べるインタラクティブな講座です。
  • 「スタイルガイド」では、Pythonで読みやすくきれいなコードを書くためのガイドライン(PEP8)を主に紹介しています。
  • 各コード例はその場で実行して結果を確認できます。
    ページ再読み込みで元に戻るので、自由に試してみてください。

「ステップ3 関数」の続きです。

前回までに、関数のパラメータと引数の基本について学びました。
今回は、より柔軟な関数定義を可能にする、特殊なパラメータの形式を紹介します。

関数に渡す引数の数が事前に決まっていない場合、アンパックでも紹介したアンパック演算子(*)を使って、
任意の個数の位置引数を受け取ることができます。

*args パラメータ (可変長位置引数)
def 関数名(*args): ...
  • *argsパラメータは、任意個数の位置引数の組をタプルとして受け取り、変数argsに代入します
  • 慣習的に args という名前が使われますが、別の名前を使うことも可能です

最初の引数を個別の変数に代入して、残りをargsに代入する使い方も可能です:

*argsパラメータの後に定義するすべてのパラメータは、位置引数として値を代入できなくなり、
キーワード引数としてのみ代入できる後述のキーワード専用パラメータとなります。

アンパック演算子(*)を使うと、リストやタプルをアンパックして、
可変長位置引数として関数に入力することができます:

📚練習問題
  1. 任意個の数値を受け取る関数で、入力値の平均値と最大値を同時に返す関数を作成しましょう
  2. その関数に、以下をアンパック演算子(*)を使用して入力して、結果を表示しましょう
    1. numbers = [1, 2, 3, 4, 5]
    2. 上記のnumbersnumbers2 = (1000, 100, 10) をまとめて入力
    3. 0 ~ 100 の整数
解答例

関数に渡すキーワード引数の数が事前に決まっていない場合、辞書アンパック演算子(**)を使って、
任意の個数のキーワード引数を受け取ることができます。

**kwargsパラメータ (可変長キーワード引数)
def 関数名(**kwargs): ...
  • **kwargs は任意の数のキーワード引数を辞書(dict)として受け取ります
  • 慣習的に kwargs(keyword arguments の略)が使われますが、別の名前を使うことも可能です

通常の引数や可変長位置引数と組み合わせて使うことも可能です:

辞書アンパック演算子(**)を使うと、辞書の各要素をキーワード引数として関数に入力できます:

📚練習問題
  1. キーワード引数で与えられた成績データ(名前=点数の形式)から、次の情報を辞書で返す関数を作成しましょう。

    • 平均点
    • 最高得点
    • 最高得点者のリスト
  2. 次の辞書を辞書アンパック演算子(**)で渡して実行し、結果を表示してください。

    1. scores1 = {"Alice": 85, "Bob": 58, "Charlie": 70}
    2. scores2 = {"David": 45, "Eve": 100}
    3. scores1scores2 をまとめて渡す
解答例
📚練習問題

あなたはショッピングサイトの集計システムを作っています。

位置引数で任意個数の商品価格と、キーワード引数で任意個数の割引クーポンの情報を受け取り、
合計金額を計算する関数 calculate_total を作成しましょう

  • 使用例: calculate_total(100, 50, 30, coupon1=0.1, coupon2=0.2) (100円, 50円, 30円の商品がカートに入っていて、1割引と2割引のクーポンが存在する)
  • 入力されたクーポン情報のうち、最も割引率の高いクーポンを適用した合計金額を返すようにしましょう
解答例

関数定義のパラメータリストに / を追加すると、それより前のパラメータはすべて位置引数のみを受け取るようになり、キーワード引数で代入ができなくなります。
位置引数のみを受け取るパラメータのことを 位置専用パラメータ (Positional-only parameters)といいます。
(この機能は、Python 3.8 から導入されました。)

位置専用パラメータ
def 関数名(位置専用パラメータ1, 位置専用パラメータ2, ..., /, 通常パラメータ, ...): ...

関数定義のパラメータリストに * を追加すると、それより後のパラメータはすべてキーワード引数のみを受け取るようになり、位置引数で代入ができなくなります。
キーワード引数のみを受け取るパラメータのことを キーワード専用パラメータ (Keyword-only parameters)といいます。

キーワード専用パラメータ
def 関数名(通常パラメータ, ..., *, キーワード専用パラメータ, ...): ...
📚練習問題

以下の要件を満たす関数 get_fullname を作成しましょう:

  1. 名(first_name)と姓(last_name)とセパレータ(separator)を受け取り、名と姓をセパレータで区切った文字列を戻り値として返します
    • 例: first_name: “太郎”, last_name: “田中”, separator: “##” => “太郎##田中”
  2. first_namelast_nameは位置専用パラメータとします
  3. separatorはキーワード専用パラメータとします
  4. separatorのデフォルト引数はスペース(" ")とします
解答例

関連記事