模块课程(2/4)
默认参数和关键字参数
函数参数可以有默认值:如果调用者不传递 对于它们,使用默认值。您还可以调用传递参数的函数 按名称(关键字参数)。
默认参数
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'具有默认值的参数必须位于不带默认值的参数之后:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxError关键字参数
您可以按名称以任何顺序传递参数,从而使调用更加方便 可读:
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黄金法则:在调用中,位置参数位于关键字参数之前。
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ 可变的默认陷阱
永远不要使用可变对象(列表、字典、集合)作为默认值: 当函数被定义并共享时,默认值被评估一次 所有通话。
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 作为哨兵并在内部创建它:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return lista可变默认参数的危险
切勿使用可变对象(如列表或字典)作为参数的默认值:例如 def add(x, my_list=[])。默认值在定义函数时仅计算一次,这意味着后续调用将共享完全相同的可变对象!最佳实践是使用 None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_list尝试一下
定义返回基数 ** 指数的“power(base, exponent=2)”。计算“square = power(5)”和“cube = power(5, exponent=3)”。评估“(正方形,立方体)”。
显示提示
返回基数 ** 指数
3 次尝试后可用的解决方案
复习练习
定义“create_record(name,values=None)”,当 value 为 None 时,使用新的空列表。将 1 附加到 value 并返回记录字典 {'name': name, 'values': value}。调用它两次而不传递值并分配给“a”和“b”。评估 `(a['values'], b['values'])`。
显示提示
使用 None 作为默认值并在函数内创建列表。
3 次尝试后可用的解决方案
额外的挑战
定义一个函数 \`greet(name, message="Hello")\`,返回格式化字符串 \`"{message}, {name}!"\`。通过调用 \`greet("Bob")\` 作为最后一个表达式来测试该函数。
显示提示
使用默认参数 message="Hello" 和 f 字符串作为返回的问候语。
3 次尝试后可用的解决方案