メインコンテンツにスキップ
モジュール 5 · レッスン 2 / 4コース内の 18/36~12 min
モジュールのレッスン (2/4)

デフォルトパラメータとキーワードパラメータ

関数パラメータには デフォルト値 を指定できます: 呼び出し元が渡さない場合 それらの場合は、デフォルトが使用されます。パラメータを渡して関数を呼び出すこともできます 名前 (キーワード引数)。

デフォルトパラメータ

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

デフォルト値を持つパラメータは、デフォルト値を持たないパラメータの後に来る必要があります:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

キーワード引数

引数を名前で任意の順序で渡すことができるため、呼び出しがより簡単になります。 読み取り可能:

Python
def crea_utente(nome, eta, attivo=True):
    return {"nome": nome, "eta": eta, "attivo": attivo}

crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada")     # any order when all are keyword

黄金律: 呼び出しでは、位置引数はキーワード引数の前に置きます。

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️ 変更可能なデフォルトの落とし穴

絶対に可変オブジェクト (list、dict、set) をデフォルト値として使用しないでください。 デフォルトは、関数が定義されたときに 1 回評価され、関数間で共有されます。 すべての通話。

Python
def aggiungi(elemento, lista=[]):   # BUG!
    lista.append(elemento)
    return lista

aggiungi(1)    # [1]
aggiungi(2)    # [1, 2]    !!! not [2] as you'd expect
aggiungi(3)    # [1, 2, 3]

正しいパターン: None をセンチネルとして使用し、内部に作成します。

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

変更可能なデフォルト引数の危険性

変更可能なオブジェクト (リストや辞書など) をパラメーターのデフォルト値として使用しないでください (例: def add(x, my_list=[]))。デフォルト値は関数の定義時に 1 回だけ評価されます。つまり、後続の呼び出しではまったく同じ可変オブジェクトが共有されることになります。ベスト プラクティスは、None を使用することです。

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

試してみてください

運動#python.m5.l2.e1
試行回数: 0読み込み中…

** 底の指数を返す `power(base, exponent=2)` を定義します。 `square = power(5)` と `cube = power(5, exponent=3)` を計算します。 `(正方形、立方体)`を評価します。

エディターを読み込み中…
ヒントを表示

基数 ** 指数を返します

3 回の試行後に解決策が利用可能になります

復習演習

運動#python.m5.l2.e2
試行回数: 0読み込み中…

値が None の場合に新しい空のリストを使用する `create_record(name,values=None)` を定義します。値に 1 を追加し、レコード dict {'name': name, 'values':values} を返します。値を渡さずに 2 回呼び出して、`a` と `b` に代入します。 `(a['values'], b['values'])` を評価します。

エディターを読み込み中…
ヒントを表示

デフォルトとして None を使用し、関数内にリストを作成します。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#python.m5.l2.e3
試行回数: 0読み込み中…

書式設定された文字列 \`"{message}, {name}!"\` を返す関数 \`greet(name, message="Hello")\` を定義します。最後の式として \`greet("Bob")\` を呼び出して関数をテストします。

エディターを読み込み中…
ヒントを表示

返されるグリーティングには、デフォルト パラメータ message="Hello" と f-string を使用します。

3 回の試行後に解決策が利用可能になります