跳转到主要内容
模块 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

⚠️ 可变的默认陷阱

永远不要使用可变对象(列表、字典、集合)作为默认值: 当函数被定义并共享时,默认值被评估一次 所有通话。

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=[])。默认值在定义函数时仅计算一次,这意味着后续调用将共享完全相同的可变对象!最佳实践是使用 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加载中...

定义“create_record(name,values=None)”,当 value 为 None 时,使用新的空列表。将 1 附加到 value 并返回记录字典 {'name': name, 'values': value}。调用它两次而不传递值并分配给“a”和“b”。评估 `(a['values'], b['values'])`。

正在加载编辑器...
显示提示

使用 None 作为默认值并在函数内创建列表。

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m5.l2.e3
尝试:0加载中...

定义一个函数 \`greet(name, message="Hello")\`,返回格式化字符串 \`"{message}, {name}!"\`。通过调用 \`greet("Bob")\` 作为最后一个表达式来测试该函数。

正在加载编辑器...
显示提示

使用默认参数 message="Hello" 和 f 字符串作为返回的问候语。

3 次尝试后可用的解决方案