python不同函数参数的概念解读(位置参数、默认参数、可变参数、关键字参数、命名关键字参数)

python不同函数参数的概念解读(位置参数、默认参数、可变参数、关键字参数、命名关键字参数、命名位置参数)

这里记录一下最近复习python 函数参数相关知识的概念和示例。系统学习内容可参考廖雪峰老师的笔记

一、示例

当我们在定义函数的时候,往往需要定义函数的参数,有的时候会不理解各种函数参数都是干啥的,下面先给个简单的例子看看:

def func(a, b=1, *args, **kwargs):
	print(a)
	print(b)
	print(args)
	print(kwargs)

从上面例子中,

  • a属于默认参数
  • b属于位置参数
  • args和kwargs都属于可变参数,至于差别我们后面再说。

二、不同参数类别

1. 位置参数

python中按先后位置传入的参数,例如下面的例子:

def add(a, b):
	return a + b

执行:

print(add(5, 10))

结果:

15

当我们定义add函数时,a, b两个参数按顺序接受参数,赋值给a和b,这种类型的参数最为常见。

2. 默认参数

python中如果我们想设定默认值,并不想每次都要传入这个参数,那么就可以使用默认参数,例如下面的例子:

def power(a, n=2):
	print(a ** n)

执行:

扫描二维码关注公众号,回复: 16633783 查看本文章
power(2)
power(2, 2)
power(2, 10)

结果:

4
4
1024

当我们定义power函数,求a^n 时,我们更多时候想用a^2,那么就可以将n设为一个默认参数,传入一个参数时,会默认使用n=2,当然我们也可以传入两个参数,这时候会按位置更改n。

合理使用默认参数可以降低我们函数传入参数的复杂度。

注意:

  1. 必须参数必须要在默认参数前面
  2. 尽量把变化大的参数定义在前面。

3. 可变参数

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使用。

4. 关键字参数

除了可变参数之外,我们除了必选的可变参数之后,可能还需要一些非必选的参数,使用关键字参数允许任意个参数,函数调用时组装成一个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上,但不影响外部变量。

5. 命名关键字参数

有时候,尽管我们运行关键字参数的传入,但是又不想让肆无忌惮的传入,这时候就需要限制一下哪些是可以接收的关键字参数,主要的用法有以下几种:

#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)
  • 示例1:我们可以在位置参数之后加一个*,后面的都被视作是命名关键字参数。
  • 示例2:当我们参数中存在可变参数是,那么就不需要再添加*来作分割。
  • 示例3:命名关键字参数是可以缺省的。

注意:

  1. 命名关键字必须要传入参数名,除非其为默认参数;例如上述示例2,必须用city=‘xxx’来传入命名关键字参数,否则会报错。
  2. 缺少*时,命名关键字参数被视为位置参数。

三、总结

通过上述的描述,结合我们的实践,可以发现,很多时候,都可以用下面的格式,来描述一个函数,即由可以不限数量的可变参数和命名关键字参数组成。

func(*args, **kwargs)

猜你喜欢

转载自blog.csdn.net/qq_36306288/article/details/128117566
今日推荐