这里记录一下最近复习
python
函数参数
相关知识的概念和示例。系统学习内容可参考廖雪峰老师的笔记
当我们在定义函数的时候,往往需要定义函数的参数,有的时候会不理解各种函数参数都是干啥的,下面先给个简单的例子看看:
def func(a, b=1, *args, **kwargs):
print(a)
print(b)
print(args)
print(kwargs)
从上面例子中,
python中按先后位置传入的参数,例如下面的例子:
def add(a, b):
return a + b
执行:
print(add(5, 10))
结果:
15
当我们定义add
函数时,a, b两个参数按顺序接受参数,赋值给a和b,这种类型的参数最为常见。
python中如果我们想设定默认值,并不想每次都要传入这个参数,那么就可以使用默认参数,例如下面的例子:
def power(a, n=2):
print(a ** n)
执行:
power(2)
power(2, 2)
power(2, 10)
结果:
4
4
1024
当我们定义power
函数,求a^n 时,我们更多时候想用a^2,那么就可以将n设为一个默认参数,传入一个参数时,会默认使用n=2,当然我们也可以传入两个参数,这时候会按位置更改n。
合理使用默认参数可以降低我们函数传入参数的复杂度。
注意:
- 必须参数必须要在默认参数前面
- 尽量把变化大的参数定义在前面。
python中如果我们输入参数的个数是可变的
,那么这时候就需要用到可变参数了,例如我们计算add时,如果不知道有几个参数要传入,那么就可以使用可变参数:
def add(*nums):
print(nums)
print(sum(nums))
执行:
add(2, 3)
add(2, 2, 2)
add()
结果:
(2, 3)
5
(2, 2, 2)
6
()
0
当我们执行add
函数,*nums会把传入的参数按顺序组装成一个tuple,然后供我们使用。
这里会有一个问题,那就是如果你的参数本身就是一个list或者tuple,那要怎么传入呢,这个时候就可以使用*nums传入,如下:
nums = [1,2,3]
add(*nums)
这样的话,传入的就是nums这个list中的1,2,3三个数字,然后变为tuple使用。
除了可变参数之外,我们除了必选的可变参数之后,可能还需要一些非必选的参数,使用关键字参数允许任意个参数,函数调用时组装成一个dict
:
def example(a, b, **kw):
print(name, age, kw)
执行:
example('123', 20, c=0, d=1)
结果:
123 20 {'c': 0, 'd': 1}
注意:
可以发现,关键字参数也允许传入任意个参数,会将外部传入的key-value形式的参数拷贝到kw上,但不影响外部变量。
有时候,尽管我们运行关键字参数的传入,但是又不想让肆无忌惮的传入,这时候就需要限制一下哪些是可以接收的关键字参数
,主要的用法有以下几种:
#eg1
def get(name, age, *, city, job):
print(name, age, city, job)
#eg2
def get(name, age, *args, city, job):
print(name, age, args, city, job)
#eg3
def get(name, age, *, city='XA', job):
print(name, age, city, job)
注意:
- 命名关键字必须要传入参数名,除非其为默认参数;例如上述示例2,必须用city=‘xxx’来传入命名关键字参数,否则会报错。
- 缺少*时,命名关键字参数被视为位置参数。
通过上述的描述,结合我们的实践,可以发现,很多时候,都可以用下面的格式,来描述一个函数,即由可以不限数量的可变参数和命名关键字参数组成。
func(*args, **kwargs)