Pythonインタラクティブガイド - ステップ3 関数 (3) - 特殊なパラメータ
- 本講座「Pythonインタラクティブガイド」は、手を動かしながらPythonプログラミングの基礎を学べるインタラクティブな講座です。
- 「スタイルガイド」では、Pythonで読みやすくきれいなコードを書くためのガイドライン(PEP8)を主に紹介しています。
- 各コード例はその場で実行して結果を確認できます。
ページ再読み込みで元に戻るので、自由に試してみてください。
「ステップ3 関数」の続きです。
3.2. 特殊なパラメータ
前回までに、関数のパラメータと引数の基本について学びました。
今回は、より柔軟な関数定義を可能にする、特殊なパラメータの形式を紹介します。
3.2.1. *args
パラメータ (可変長位置引数)
関数に渡す引数の数が事前に決まっていない場合、アンパックでも紹介したアンパック演算子(*
)を使って、
任意の個数の位置引数を受け取ることができます。
*args
パラメータは、任意個数の位置引数の組をタプルとして受け取り、変数args
に代入します- 慣習的に
args
という名前が使われますが、別の名前を使うことも可能です
最初の引数を個別の変数に代入して、残りをargs
に代入する使い方も可能です:
*args
パラメータの後に定義するすべてのパラメータは、位置引数として値を代入できなくなり、
キーワード引数としてのみ代入できる後述のキーワード専用パラメータとなります。
リストやタプルをアンパックして渡す
アンパック演算子(*
)を使うと、リストやタプルをアンパックして、
可変長位置引数として関数に入力することができます:
- 任意個の数値を受け取る関数で、入力値の平均値と最大値を同時に返す関数を作成しましょう
- その関数に、以下をアンパック演算子(
*
)を使用して入力して、結果を表示しましょうnumbers = [1, 2, 3, 4, 5]
- 上記の
numbers
とnumbers2 = (1000, 100, 10)
をまとめて入力 - 0 ~ 100 の整数
解答例
3.2.2. **kwargs
パラメータ (可変長キーワード引数)
関数に渡すキーワード引数の数が事前に決まっていない場合、辞書アンパック演算子(**
)を使って、
任意の個数のキーワード引数を受け取ることができます。
**kwargs
は任意の数のキーワード引数を辞書(dict
)として受け取ります- 慣習的に
kwargs
(keyword arguments の略)が使われますが、別の名前を使うことも可能です
通常の引数や可変長位置引数と組み合わせて使うことも可能です:
辞書をアンパックして渡す
辞書アンパック演算子(**
)を使うと、辞書の各要素をキーワード引数として関数に入力できます:
-
キーワード引数で与えられた成績データ(名前=点数の形式)から、次の情報を辞書で返す関数を作成しましょう。
- 平均点
- 最高得点
- 最高得点者のリスト
-
次の辞書を辞書アンパック演算子(
**
)で渡して実行し、結果を表示してください。scores1 = {"Alice": 85, "Bob": 58, "Charlie": 70}
scores2 = {"David": 45, "Eve": 100}
scores1
とscores2
をまとめて渡す
解答例
あなたはショッピングサイトの集計システムを作っています。
位置引数で任意個数の商品価格と、キーワード引数で任意個数の割引クーポンの情報を受け取り、
合計金額を計算する関数 calculate_total
を作成しましょう
- 使用例:
calculate_total(100, 50, 30, coupon1=0.1, coupon2=0.2)
(100円, 50円, 30円の商品がカートに入っていて、1割引と2割引のクーポンが存在する) - 入力されたクーポン情報のうち、最も割引率の高いクーポンを適用した合計金額を返すようにしましょう
解答例
3.2.3. 位置専用パラメータ (/
)
関数定義のパラメータリストに /
を追加すると、それより前のパラメータはすべて位置引数のみを受け取るようになり、キーワード引数で代入ができなくなります。
位置引数のみを受け取るパラメータのことを 位置専用パラメータ (Positional-only parameters)といいます。
(この機能は、Python 3.8 から導入されました。)
3.2.4. キーワード専用パラメータ (*
)
関数定義のパラメータリストに *
を追加すると、それより後のパラメータはすべてキーワード引数のみを受け取るようになり、位置引数で代入ができなくなります。
キーワード引数のみを受け取るパラメータのことを キーワード専用パラメータ (Keyword-only parameters)といいます。
以下の要件を満たす関数 get_fullname
を作成しましょう:
- 名(
first_name
)と姓(last_name
)とセパレータ(separator
)を受け取り、名と姓をセパレータで区切った文字列を戻り値として返します- 例:
first_name
: “太郎”,last_name
: “田中”,separator
: “##” => “太郎##田中”
- 例:
first_name
とlast_name
は位置専用パラメータとしますseparator
はキーワード専用パラメータとしますseparator
のデフォルト引数はスペース(" "
)とします