2022年 11月 16日

【笔记】python的传递实参:位置实参、关键字实参、默认值、等效的函数调用、避免实参错误

文章目录

  • 一、传递实参
    • 1.位置实参
    • 2.关键字实参
    • 3.默认值
    • 4.等效的函数调用
    • 5.避免实参错误

一、传递实参

函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典

1.位置实参

调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的关联方式是基于实参的顺序。这种关联方式称为位置实参。

为了弄明白工作原理,我们来看一个

:定义一个显示宠物信息的函数,这个函数指出一个宠物属于哪种动物以及它叫什么名字。

def describe_pet(animal_type,pet_name):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name}")

describe_pet('hamster','harry')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出结果
在这里插入图片描述
当我们使用位置实参的时候,需要注意两点:

1.我们可以根据需要多次调用函数

2.位置实参的顺序很重要

2.关键字实参

关键字实参传递给函数名称值对。因为直接在实参中将名称和值关联起来,所以向函数传递实参时不会混淆。关键字实参让我们无须考虑函数调用中的实参顺序,还清楚的指出了函数调用各个值的用途。

:重新编写上例

def describe_pet(animal_type,pet_name):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name}")

describe_pet(animal_type='hamster',pet_name='harry')
describe_pet(pet_name='harry',animal_type='hamster')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果
在这里插入图片描述
关键字实参的顺序无关紧要,我们可以看到例中两种调用传参是等效的。

使用关键字实参时,务必准确指定函数定义中的形参名。

3.默认值

编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则,将使用形参的默认值。

给形参指定的默认值后,可在函数调用中省略相应的实参。

使用默认值可简化函数调用,还可以清楚的指出函数的典型用法

:当我们发现animal_type大多是小狗时,我们可以给形参animal_type的默认值设为dog

def describe_pet(pet_name,animal_type='dog'):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name}")

describe_pet(pet_name='harry')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果
在这里插入图片描述
**特别需要注意的是!!!**可以看到我的代码里面修改了形参animal_type和pet_name的位置,这是是因为牵扯到了位置实参的问题。

使用默认值时,必须先在形参列表中列出没有默认值的形参,在列出有默认值的实参。这让python依然能够正确地解读位置实参。

4.等效的函数调用

鉴于可混合使用位置实参关键字实参、和默认值,通常有多种等效的函数调用方式

def describe_pet(pet_name,animal_type='dog'):
    """显示宠物的信息"""
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name}")

#调用函数
#一条名为Willie的小狗
describe_pet('willie')
describe_pet(pet_name='willie')

#一只名为Harry的小仓鼠
describe_pet('harry','hamster')
describe_pet(pet_name='harry',animal_type='hamster')
describe_pet(animal_type='hamster',pet_name='harry')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果
在这里插入图片描述
其实我们使用哪种调用方式都无关紧要,只要函数调用能生成我们期望的输出就可。

5.避免实参错误

一般我们看到报错信息里面出现traceback,就是因为出现实参不匹配错误