第23天:参数类型——位置参数、默认参数、关键字参数

0 阅读2分钟
  • 学习目标

    • 掌握位置参数:调用时按顺序传递
    • 掌握默认参数:定义时给参数默认值,调用时可省略
    • 掌握关键字参数:调用时指定参数名,顺序可任意
    • 理解默认参数的坑:默认值如果是可变对象(如列表)要小心
  • 实践任务

    1. 编写函数 describe_pet(animal_type, pet_name),使用位置参数调用两次。
    2. describe_pet 添加默认参数 animal_type='dog',再次调用。
    3. 使用关键字参数调用同一个函数,交换参数顺序。
    4. 编写一个函数 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("狗","花花")

image.png

describe_pet 添加默认参数 animal_type='dog',再次调用。

def describe_pet(pet_name,animal_type="狗"):
    print(f"{animal_type}的名字是{pet_name}")
describe_pet("师妃暄","老虎")
describe_pet("花花")

image.png

使用关键字参数调用同一个函数,交换参数顺序。

def describe_pet(animal_type,pet_name):
    print(f"{animal_type}的名字是{pet_name}")
describe_pet(pet_name="天启",animal_type="老虎")

image.png

编写一个函数 add_student(name, age, cls='一班'),用不同方式调用。

def add_student(name,age,cls="一班"):
    print(f"{cls}{name}今年{age}")
add_student("李红",21)
add_student(age="25",name="刘三")

image.png