山地人

Python 函数参数

山地人
山地人
2021-07-02

上一篇,我们对函数的定义已经有了基本了解,这一篇我们重点关注函数参数,通过本篇的学习,你会学习到:

  1. 位置参数
  2. 关键字参数
  3. 可变长度的参数
  4. 参数默认值
  5. 可变的参数默认值
  6. 参数传递

在Python中我们可以给函数定义三种类型的参数:位置参数关键字参数可变长参数

位置参数

位置参数在调用的时候,传入的参数是有位置要求的,必须在对饮的位置上对应的参数,所以被称为位置参数。另外传递的参数数量也必须和定义的一致,所以位置参数也被称为是必要参数。

def product(name, price, count):
print(f'{name}:{price}x{cout}')

调用函数时,必须在对应的位置传入正确的参数。

product("水杯", 29.9, 1)

这样调用后,三个传入的实际参数,会被传递给对应的形参上。

name = "水杯"
price = 29.9
count = 1

动动手

  • 尝试调用函数中传入参数的顺序"水杯", 29.9, 1,观察运行结果变化
  • 如果传入函数的参数数量增加,或者减少,对函数运行是否有影响

关键字参数

函数在调用的时候,通过位置参数方式放置参数是比较简单直观的,但是也有缺点就是传递参数的顺序必须严格按照位置要求方式。下面介绍的关键字参数传递方法对顺序没有要求。只需要在传递参数的时候指明传递给哪个参数名:keyword=value

上面的product函数可以这样调用:

product(name:"水杯", price=29.9, count=1)
product(price=29.9, count=1,name:"水杯")

参数的顺序没有要求。

运行下面的沙盒,并尝试调整product函数调用的参数顺序。

位置参数和关键字参数混用

学习了两种参数传递方式后,你是否有疑惑是否可以将两种参数传递方式混用?既然有疑惑我们就来做个实验:

首先,将第一个参数改成位置参数,然后测试,运行成功。

接下来我们测试下,是否可以先使用关键字参数,后面放置位置参数。

运行结果报错,提示位置参数放在关键词参数之前是语法错误。

通过上面的实验,我们得出结论位置参数关键词参数可以混用,但是位置参数必须放在关键词参数之前。

参数默认值

Python是支持在定义函数时为参数添加默认值的,添加默认值后,这些有默认值的参数可以不传递参数而使用默认值作为参数。

下面继续改造我们之前的product函数。

参数默认值的定义和关键词参数的方式很像,直接在对应的参数名后面添加=defaultValue的方式来定,但定义和使用这些默认参数是有一些要求的:

  1. 默认值定义的时候可以只为部分参数设置默认值,但设置部分参数为默认值的这些参数必须放在函数参数的末尾。
# 正确的默认值定义,部分带默认值的参数放在参数列表尾部
def product(name, price=0, count=0):
pass
# 错误的默认值定义,部分默认值参数定义到了参数列表的开头
def product(name="未知", price, count):
pass
  1. 在调用这些带默认参数的函数时,如果要省略一部分带默认值的参数,不能前面省略后面使用
def product(name="未知", price=0, count=0):
pass\n
# 正确的参数调用
product()
product(name="苹果")
product(name="苹果", price=5.2)\n
# 以下都是错误的参数调用方式
product(, price=5.2)
product(, price=5.2, count=0)
product(, 5.2, 0)
product(, , 0)

可变长参数

Python支持一种可变长参数,这种变长参数支持传入零到多个数量不等的参数。

变长参数的定义,只需要在定义参数时,在参数名称前面加一个*号

def sum(*nums):
pass

这里的nums就是一个可变长参数。

sum()
sum(1,2)
sum(1,2,3,4)

调用时可以传入任意数量的参数。

定义时注意:

可变长参数可以和普通参数在一起定义,定义的位置也没有要求,但是每个函数只能拥有一个可变长参数。

调用时注意:

对于有可变长参数的函数,在调用是,其他参数必须要使用关键词参数的方式显式指定。剩下的参数会被放置到可变长参数中。

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。