Python 函数参数


没啥用的话:

最近复习了python的基础语法,发现很多东西都已忘记,现在重新捡起来,以博客的方式记录,以便巩固和复习


python中的函数参数

在python中构造函数是个再简单不过的过程了,只需要像下面这样。

def 函数名(参数1,参数2,....):  
    函数体

其中函数名可以随意取,自己写程序的话只要函数名自己知道啥意思就行;函数体就要根据函数具体功能来编写啦。这里主要介绍函数的参数。
函数的参数包括以下五类:
1.必须参数、
2.默认参数、
3.可变参数、
4.关键字参数、
5.组合参数。

下面我将对以上五类参数进行详述。

1.必须参数

def add(a, b, c, d): 
    result = a + b + c + d
    print(result)

当我们调用add函数时,必须要在函数中体现这四个参数,

add(1, 2, 3 ,4)
>>>10

其中a, b, c, d就为函数的必须参数.
但有时,我们的函数体本身不需要参数,比如我们只想打印某句话的时候,这时函数参数也就不不必须的,例如:

def add(a, b, c, d): 
    print(‘hello world!’)

结果等同于

def printf(): 
    print(‘hello world!’)

不同的是,调用add()函数的时候,要把参数补齐。

add(s, 4, 5, l)就相当于 printf()
>>>hello world!

2.默认参数

在定义函数时,形参给定一个值,这就是默认参数。例如

def add_1(a, b=10, c=20, d=30):  
    result = a + b + c + d
    print(result)

当我们调用add_1()时,只需要将参数a进行带入即可

add_1(5)
>>>65

但有时我们想更改默认参数的值,只需要将想更改的值带入函数中默认参数的位置即可,例如:

add_1(5, 100)
>>>155

此时,a = 5,b = 100,100就会覆盖b原来的默认值。但是,如果我们想改变靠后位置的默认值的时候,我们可以在调用函数的时候对默认参数进行赋值操作,例如:

add_1(5, c=50)
>>>95

此时,a = 5,b=10,c = 50,d=30.50就会覆盖c原来的默认值20。
当默认参数较多时,也可以改变其参数的默认值,

def func(a,b=10,c=3):
    print(a,b,c)

func(3,c=10,b=7)
>>>3, 7, 10

3.可变参数

可变参数起到函数传递参数的作用。形式为:
*args:接收N个位置参数,并转换成元组tuple形式
其中,args是非固定的,你可以换各种名称,前提是在名称前要有且仅有一个 *(星号)。
具体看下面的简单示例:

def func(a, b, c, *d):
    print(a, b, c, d)

func(1,2)  
>>>报错,因为参数数目不对
func(1,2,3,4)  
>>>1, 2, 3, (4,)
func(1, 2, 3, 4, 5, 6, 7, 8, 9) 
>>>1, 2, 3, (4, 5, 6, 7, 8, 9) 

从上面的例子可以看出,调用函数时,在满足函数定义时的必要参数的个数,其余的便以元组的形式传递出来,也就是说它相当于一个大的容器,可以容纳很多个参数。当元祖中仅有一个元素的时候,千万不要忽略了后面的逗号。实际上就是一个装包的过程。
如果,我们的参数是元组、列表或者字符串呢?我们看下面的示例:

L = [1,2,3,4,5]
T = (6,7,8,9,10)
def func_1(a, *args):
	print(a, args)

func_1(0,T)
>>>0,((6,7,8,9,10),)
func_1(0,L)
>>>0, ( [1,2,3,4,5],)

重上面的例子可以看出,*args将元组或者列表转换成装包后元组的一个元素。
那么新的问题来了,如果在调用的时候参数前添加 *号呢?接下来我们看下面的例子:

L = [1,2,3,4,5]
T = (6,7,8,9,10)
def func_1(a, *args):
	print(a, args)

func_1(0,*T)
>>>0, (6,7,8,9,10)
func_1(0,*L)
>>>0, (1,2,3,4,5)

原来的列表L在调用函数func_1()后变成了元组,而原来的元组T在调用函数func_1()后保持不变,也可以说由元组转换成元组。实际上,这个过程可以理解为装包–>拆包–》装包的过程。

4.关键字参数

关键字参数就是在调用函数时,传入实参时带参数名,用这样的方式传入的实参叫做关键字参数。一个简单的形式如下:

def func(**kwargs): 
    ............

具体我们通过下面的例子进行讲解,

def func_2(**kwargs): 
    print(kwargs)

func_2(a=1,b=2,c=3) 
>>>{'a': 1, 'b': 2, 'c': 3}

**kwargs就是说,只要调用函数送值,送的值必须是key=value的形式,输出为字典形式。
我们看下面的一个示例:

dict1 = {'001':'机电工程','002':'计算机科学','003':'电子信息','004':'新媒体'}
def func_2(**kwargs):
    print(kwargs)

func_2(**dict1)
>>>{'001':'机电工程','002':'计算机科学','003':'电子信息','004':'新媒体'}

重上面的例子可以分为以下几个步骤:
1.将字典进行拆包,func_2(001=机电工程,002=计算机科学,…)
2.func_2里面的参数都是关键字参数
3.将关键字参数进行一次装包动作
4.装包成功:kwargs
原理其实与*args差不太多,只不过是将元组换成了字典。
下面来一个复杂的示例:

students_choose = {'01':('机电工程学院', 01),"02":("计算机科学与技术学院",02),"03":('电子信息工程学院',03),'04':('新媒体艺术学院',04)}
def choose_college(name,**college):
print('{}想选择的学院是:'.format(name))
    if isinstance(college,dict):
        for name, num in college.values():
            print('{}的编号为:{}'.format(name,num))
# 调用
choose_college('小明',**students_choose )
>>>小明想选择的可学院是:
>>>机电工程学院的编号为:01
>>>计算机科学与技术学院的编号为:02
>>>电子信息工程学院的编号为:03
>>>新媒体艺术学院的编号为:04

5.组合参数

顾名思义,组合参数就是定义函数时,出现多类型参数形式,如下例所示:

def func_3(a,b=1,c=2,**kwargs):
    print(a,b,c,kwargs)

func_3(5)
>>>5 1 2 {}
func_3(5,b=10)
>>>5 10 2 {}
func_3(5,9,10,a=1,b=2)
>>>报错 变量名不可重复使用
func_2(3,c=5,b=7,x=1,y=2)
>>>3 7 5 {'x': 1, 'y': 2}

对于上述组合参数我们需要注意一下点:
1.变量名不可以重复使用;
2.关键值参数必须以key=value的形式给出,并且输出为字典;
3.关键值参数为非必要参数,可以不给予其值,输出为空字典;
4.默认参数数值可以改变。
下面我们看更多类型参数的示例:

L = [1,2,3,4,5]
T = (6,7,8,9,10)
D = {'1':'i','2':'j','3':'k'}
def func_4(a,b=10,c=20,*args,**kwargs):
    print(a,b,c,args,kwargs)

func_4(5)
>>>5 10 20 () {}
func_4(5,7)
>>>5 7 20 () {}
func_4(5,c=100,b=20)
>>>5 20 100 () {}
func_4(5,*L)
>>>5 1 2 (3, 4, 5) {}
>>>将L拆包后1赋值给b,2赋值给c,其余的进行装包
func_4(5,L)
>>>5 [1, 2, 3, 4, 5] 20 () {}
>>>将L整体赋值给b,c不变
func_4(5,*T)
>>>5 6 7 (8, 9, 10) {}
>>>将T拆包后6赋值给b,7赋值给c,其余的进行装包
func_4(5,T)
>>>5 (6, 7, 8, 9, 10) 20 () {}
>>>>将T整体赋值给b,c不变
func_4(5,d=9,e=6)
>>>5 10 20 () {'d': 9, 'e': 6}
func_4(5,**D)
>>>5 10 20 () {'1': 'i', '2': 'j', '3': 'k'}
func_4(5,b=20,c=30,*L,**D)
>>>TypeError: func_4() got multiple values for argument 'b'
>>>原因是,参数b获得了多个参数,在函数拆包时,将L列表赋值给b,同时b=20,因此报错。
func_4(5,*L,**D)
>>>5 1 2 (3, 4, 5) {'1': 'i', '2': 'j', '3': 'k'}
func_4(5,*T,**D)
>>>5 6 7 (8, 9, 10) {'1': 'i', '2': 'j', '3': 'k'}
func_4(5,L,**D)
5 [1, 2, 3, 4, 5] 20 () {'1': 'i', '2': 'j', '3': 'k'}
func_4(5,T,**D)
5 (6, 7, 8, 9, 10) 20 () {'1': 'i', '2': 'j', '3': 'k'}
>>>

以上就是我总结的函数参数的所有内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值