python中自定义函数参数,Python 自定义函数(一) 五类参数

自定义函数一直是程序编写过程中必不可少和最重要的内容之一。定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。       Python的函数定义非常简单,但灵活度却非常大。除了不需要传参数的函数之外,共有必选参数、默认参数、可变参数和关键字参数,也包括几种参数的组合使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。函数定义格式:def 函数名( [参数1,参数2…] ):函数体 (代码)一、无需传参的自定义函数不传递参数的函数是用的比较少的,相当于已经把各种信息都放在了函数内部,无需传参。import randomdef generate_random():for i in range(10):ran = random.randint(1, 20)print(ran, end=' ')generate_random()>>>6 20 18 6 19 2 13 7 11 19二、必选参数的自定义函数

函数的必选参数,指的是函数调用的时候必须传入的参数,如以下示例中,如果不传入number这个参数,那就会报错TypeError,传入参数之后就会正常输出结果。import randomdef generate_random(number):for i in range(number):ran = random.randint(1, number)print(ran, end=' ')generate_random()>>>TypeError: generate_random() missing 1 required positional argument: 'number'generate_random(8)>>>2 7 8 7 4 8 5 2

练习:随机生成若干个数字,并求最大值import randomdef max_value(number):ran = []for i in range(number):value = random.randint(1,number)ran.append(value)print(ran)max1 = ran[0]for i in ran:if max1>>[3, 7, 12, 10, 19, 16, 5, 8, 3, 4, 17, 19, 18, 7, 13, 13, 12, 13, 19, 18]19三、可变参数的自定义函数

顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把一个list或tuple传进来,但这样太过繁琐。

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。import randomdef add(*args):sum = 0if len(args) > 0:for i in args:sum += iprint('累加的和为:', sum)else:print('没有累加的和:', sum)add()add(1)add(1, 2, 3)>>>没有累加的和: 0累加的和为: 1累加的和为: 6

当传入两个或多个参数,且既包含可变参数又包含必选参数时,必选参数必须放在可变参数的前面。import randomdef add(name, *args):sum = 0if len(args) > 0:for i in args:sum += iprint('%s累加的和为:%s' % (name, sum))else:print('{}没有累加的和:{}'.format(name, sum))add('李1')add('李2', 1)add('李3', 1, 2, 3)>>>李1没有累加的和:0李2累加的和为:1李3累加的和为:6

四、默认参数的自定义函数

默认参数就是在传入的参数中有的值本身是有默认值的,这个时候调用函数的时候可以传入这个参数,用新的值取代它,也可以只传入非默认值,默认参数不传入。

如以下示例所示,其中b和c都是默认参数def add(a,b=5,c=8):sum = a+b+cprint(sum)add(1) #此时传入的1为a的值>>>14add(1,2) #此时传入的1为a的值,2替换了原本的默认参数>>>11add(1,2,3) #此时传入的1为a的值,2和3分别替换了原本的默认参数>>>6add(1,c=4) #当只想改变第三个参数的默认值而不改变第二个默认值时,就需要加上第三个参数的名字>>>10

从上面的例子可以看出,默认参数可以简化函数的调用。设置默认参数时,需要注意:

1、必选参数在前,默认参数在后,否则Python的解释器会报错;2、设置默认参数时,当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数最大的好处是能降低调用函数的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。五、关键字参数的自定义函数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。def aa(**kwargs):print(kwargs)装包aa(a=1,b='hello',c='tom')>>>{'a': 1, 'b': 'hello', 'c': 'tom'}拆包dict1 = {'a':1,'b':'hello','c':'tom'}aa(**dict1)>>>{'a': 1, 'b': 'hello', 'c': 'tom'}

示例:a和b都是必要参数,c为可变参数,d为关键字参数def bb(a,b,*c,**d):print(a,b,c,d)a,b两个必要参数传入,可变参数没有传返回空元组,关键字参数也没传返回空字典bb(1,2)>>>12(){}a,b两个必要参数传入,3和4为可变参数的值,因此返回元组,关键字参数也没传返回空字典bb(1,2,3,4)>>>12(3,4){}a,b两个必要参数传入,可变参数没有传返回空元组,x,y为关键字参数返空字典bb(1,2,x=100,y=200)>>>12(){'x':100,'y':200}a,b两个必要参数传入,3为可变参数的值返回元组,x为关键字参数返字典bb(1,2,3,x=100)>>>12(3,){'x':100}

关键字参数的作用:它可以扩展函数的功能。比如你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。六、命名关键字参数的自定义函数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。但是调用者仍可以传入不受限制的关键字参数:如果要限制关键字参数的名字,就可以用命名关键字参数。

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符,后面的参数被视为命名关键字参数。

示例:

以下示例表明,原本对于关键字参数,输入是没有限制的,但是下面使用了命名关键字参数,以'*'号标记来分隔,限制了关键字必须为height和city两个,输入其他的均会报错。def actor_lady(name, age, *, height, city):print(name, age, height, city)actor_lady('白冰', 28, 168, '南京')>>>TypeError:actor_lady()takes2positionalargumentsbut4weregivenactor_lady('白冰', 28, height=168, hometown='南京')>>>TypeError:actor_lady()gotanunexpectedkeywordargument'hometown'actor_lady('白冰', 28, height=168, city='南京')>>> 白冰 28 168 南京

总结:

1、在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用,除了可变参数无法和命名关键字参数混合。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。

2、*args是可变参数,args接收的是一个tuple;**kwargs是关键字参数,kwargs接收的是一个dict。

3、命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。定义命名的关键字参数不要忘了写分隔符 '* ',否则定义的将是必选参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值