博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3学习笔记13-函数的参数
阅读量:6686 次
发布时间:2019-06-25

本文共 3735 字,大约阅读时间需要 12 分钟。

定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数, 以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,

使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码

位置参数   也叫必须参数

位置参数必须以正确的顺序传入函数。调用时的数量必须和声明时的一样

def power(x,n):    s = 1    while n >0:        n = n-1        s = s*x    return sprint(power(5,2))

 

 

x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n

 

默认参数

def power1(x,n=2):#必选参数在前,默认参数在后    s =1    while n >0:        n = n-1        s = s*x    return sprint(power1(6)) #只传一个的时候,默认n=2print(power1(3,3)) #传两个值时,会把默认n=2替换掉

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

比如幼儿园录入学生信息时,姓名和性别是必填,年龄和城市大部分是相同的

def enroll(name,gender,age=6,city='Bejing'):    print('name:',name,'gender:',gender,'age:',age,'city:',city)enroll('Sarah','F')enroll('Bob','F',7)#当年龄不是6时传入相应值,因为年龄正好在第三位不需要告诉函数,这是年龄enroll('kael','M',city='ShangHai')#而城市第四位,需要告诉函数,这是城市,不是年龄、

注意事项:定义默认参数要牢记一点:默认参数必须指向不变对象!

def add_end(L=[]):    L.append('end')    return Lprint(add_end())print(add_end())#打印出来['end', 'end']

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],

每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

def add_end1(L=None):    if L is None:        L = []    L.append('end')    return Lprint(add_end1())print(add_end1())#可以用None这个不变对象来实现

 

可变参数

def calc(*numbers):    sum = 0    for n in numbers:        sum = sum + n    return sumprint(calc(1,2,3))print(calc(1,2))print((calc))#在参数前面加上*,函数内部,参数接收到的是个tuple。调用函数时,可以传入任意个参数,包括0个参数nums =[1,2,3]print(calc(nums[0],nums[1],nums[2]))print(calc(*nums))#Python允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:

关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

def person(name,age,**kw):# **表示关键字,参数随便填的    print('name:',name,'age:',age,'other',kw)

函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:

person('Michael',30)#可以只传必选参数person('Bob',35,city='BeiJing')person('Jack',24,Job='Engineer',city='ShangHai')#也可以传任意个关键字参数

关键字参数有什么用?它可以扩展函数的功能

比如注册的时候,必填是姓名和年龄,其他是可选项,关键字函数就可以满足这样的需求

和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:

extra = {
'city':'BeiJjing','Job':'Engineer'}person('Jack',24,city=extra['city'],job=extra['Job'])

也可以用简化的写法:

person('Jack',24,**extra)

**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict

kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra

命名关键字参数

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

仍以person()函数为例,我们希望检查是否有city和job参数:

def person1(name,age,**kw):    if 'city' in kw:        pass    if 'job' in kw:        pass    print('name:', name, 'age:', age, 'other', kw)person1('jack',24,city='Beijing',addr='chaoyang',zipes=123242)

但是调用者仍可以传入不受限制的关键字参数:

如果要限制关键字参数的名字,就可以用命名关键字参数

例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person2(name,age,*,city,job):    print(name,age,city,job)person2('jack',24,city='Beijing',job='Engineer')#给其他关键字会报错

调用的时候必须给关键字,如果不给会认为四个位置参数,而函数中只有两个,会报错

 

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person4(name,age,city='beijing',*args,job):	print(name,age,city,args,job)person4('kael',25,'shanghai',1,2,job='Engineer')#1,2就是可变参数,job就是命名关键字参数

 

 

 

参数组合

参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

def f1(a,b,c=0,*args,**kw):    print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)f1(1,2)f1(1,2,c=3)f1(1,2,3,'a','b')f1(1,2,3,'a','b',x=99)def f2(a,b,c=0,*args,d,**kw):    print('a=',a,'b=',b,'c=',c,'args=',args,'d=',d,'kw=',kw)f2(1,2,d=99,ext=None)

​​

最神奇的是通过一个tuple和dict,也可以调用上述函数:

args=(1,2,3,)kw = {
'd':99,'ext':99}f1(*args, **kw)f2(*args, **kw)

​​

所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

小结

        参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。可变参数   *参数名   函数接收的是一个tuple  调用函数传值不需要有参数名,可以传多个或不传关键字参数 **参数名 函数接收的是一个dict   调用函数传值必须要有参数名,可以传多个,但是不能限制哪些参数名命名关键字参数  *,参数名  调用函数传值必须要和函数定义的参数名一致如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了*city,job 比如city就是可变参数,可以传多个,job就是命名关键字参数

 

转载于:https://www.cnblogs.com/myal/p/9337417.html

你可能感兴趣的文章
《Java程序员的基本修养》读书笔记之内存回收
查看>>
鸟哥私房菜重温6
查看>>
适用于ASP等环境的JS日期选择控件
查看>>
CU3ER非常Cool的3D效果的Flash Slider
查看>>
Linux常用命令
查看>>
10、《每天5分钟玩转Docker容器技术》学习-Docker命令之本地镜像管理
查看>>
shell脚本:输出昨天的日期
查看>>
css优先级详解
查看>>
小白第三天
查看>>
2016年linux运维人员必会开源运维工具体系
查看>>
安装lenovo SR860 7x69服务器遇到的坑
查看>>
MIT透过机器学习技术用胺基酸预测蛋白质结构
查看>>
python课堂笔记之django-day01(8)
查看>>
Hadoop之HDFS分布式文件系统具有哪些优点?
查看>>
小型企业公司路由器做DHCP服务器
查看>>
愿不负青春 历经风雨 归期我们仍是少年|六一大童节
查看>>
JAVA数组和面向对象
查看>>
NVisionXR_iOS教程四 —— 在立方体上贴材质
查看>>
Microsoft Visual C++ Runtime library not enough space for thread data
查看>>
Centos 7 ntp时间服务器搭建
查看>>