-
学习目标
- 掌握位置参数:调用时按顺序传递
- 掌握默认参数:定义时给参数默认值,调用时可省略
- 掌握关键字参数:调用时指定参数名,顺序可任意
- 理解默认参数的坑:默认值如果是可变对象(如列表)要小心
-
实践任务
- 编写函数
describe_pet(animal_type, pet_name),使用位置参数调用两次。 - 为
describe_pet添加默认参数animal_type='dog',再次调用。 - 使用关键字参数调用同一个函数,交换参数顺序。
- 编写一个函数
add_student(name, age, cls='一班'),用不同方式调用。
- 编写函数
形参
函数定义时括号里的叫做形参
实参
函数调用时括号里传入的值叫做实参
位置参数
调用时形参与实参必须严格对应
def greet(name,age):
peint(f"{name}{age}岁")
greet("李浩",20)
#greet(20,"李浩")逻辑错误,不会报错
默认参数
定义时提供给形参的默认值,调用时可以省略实参。默认参数必须放在非默认参数后面
def greet(name,age=18):
peint(f"{name}{age}岁")
print(greet("李浩")) #name=李浩 age=18
print(greet("李浩",20)) #name=李浩 gae=20
注意默认函数定义时只计算一次,如果默认值是可变对象,多次调用时会被共享。解决办法是默认值设为none,在函数内部再进行初始化
# 错误写法
def add_item(item, lst=[]): # 危险写法
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] ← 累积了!
# 正确写法
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
关键字参数
函数调用时使用形参名称作为关键字确定传入的参数值,并允许调用的参数与声明时不一致。
def printinfo( name, age ):
print ("名字: ", name)
print ("年龄: ", age)
return
printinfo( age=50, name="runoob" )
实践任务
编写函数 describe_pet(animal_type, pet_name),使用位置参数调用两次。
def describe_pet(animal_type,pet_name):
print(f"{animal_type}的名字是{pet_name}")
describe_pet("老虎","星星")
describe_pet("狗","花花")
为 describe_pet 添加默认参数 animal_type='dog',再次调用。
def describe_pet(pet_name,animal_type="狗"):
print(f"{animal_type}的名字是{pet_name}")
describe_pet("师妃暄","老虎")
describe_pet("花花")
使用关键字参数调用同一个函数,交换参数顺序。
def describe_pet(animal_type,pet_name):
print(f"{animal_type}的名字是{pet_name}")
describe_pet(pet_name="天启",animal_type="老虎")
编写一个函数 add_student(name, age, cls='一班'),用不同方式调用。
def add_student(name,age,cls="一班"):
print(f"{cls}{name}今年{age}")
add_student("李红",21)
add_student(age="25",name="刘三")