函数的参数类型有很多,比如说:位置参数、默认值参数、关键参数、命名关键参数、可变长度参数
(1)>>> 函数名 查看函数的内存地址
(2)>>>dir(函数名) 查看函数的属性
一、位置参数(positional arguments),调用时实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。
#定义
def power(x,n):
s = 1
while n > 0:
n -= 1
s *= x
return s
#调用
power(5)#错误
power(4,5)#正确
二、默认值参数
#在上面的代码中,我们计算的是x的n次方,如果我们经常计算x的平方,我们可以用默认值参数,注意默认值参数只能出现在函数参数的最后
def power(n=2,x):#错误的
pass
def power(x,n=2):#正确的
s = 1
while n > 0:
n -= 1
s *= x
return s
#调用
power(5)#正确,计算5的平方
power(5,3)#这也是正确的,计算的是n>2的情况
#注意,如果默认值参数使用不当会导致很难发现的逻辑错误
#例如
def demo(newlist,old_list=[]):
old_list.appen(newlist)
return old_list
print(demo('5',[1,2,3,4]))#[1,2,3,4,5]
print(demo('aaa',['a','b']))#['a','b','aaa']
print(demo('a'))#['a']
print(demo('b'))#['a','b'],这是因为上一个语句中只传入了一个参数即newlist,所以返回的old_list = ['a'],当再次调用时,虽然只传入了一个参数,但是此时old_list已经被定义了
#要解决这个问题,谨记:默认参数必须指向不变的变量
def demo(newlist,old_list=None):#None不变对象作为默认参数
pass
#注意
#(1)默认值参数只在函数定义时被解释一次
#(2)可以使用“函数名.__defaults__”查看所有默认参数的当前值
#例如
demo.__defaults__
#首先有个学生注册的函数,需要传入name和gender两个参数
def enroll(name,gender):
print('name:',name)
print('gender:',gender)
#那如果我还想传入年龄、城市等信息怎么办呢?可以把年龄设置为默认参数
def enroll(name,gender,age=16,city='BeiJing'):
print('name:',name)
print('gender:',gender)
print('age:',age)
print('city:',city)
#调用
enroll('Lucy','M')
#那么如果我调用的顺序不一致呢?
三、关键参数
#关键参数主要指实参,即调用函数时的参数传递方式,通过关键参数,实参顺序和形参顺序可以不一致
def demo(a,b,c=5):
print(a,b,c)
#调用
demo(3,7)#3 7 5
demo(a=7,b=3,c=6)#7 3 6
demo(c=8,a=9,b=0)#9 0 8
四、可变长度参数
#可变长度参数主要有2种方式
#(1)*parameter用来接收多个实参并将其放在一个元组中
#(2)**parameter接收关键参数并存放到字典中,这里的关键参数必须要有键值对
#*parameter的用法
def demo(*parameter):
print(parameter)
#调用
demo(1,2,3)
#**parameter的用法
def demo(**parameter):
for item in p.items():
print(item)
#调用
demo(x=1,y=2,z=3)
#输出
('x',1)
('y',2)
('z',3)
#假如你在开发一个用户注册功能,除了用户名和年龄是必填项,其他是可选项,例如有的用户想要输出城市,另外一个用户想输出职业等等,如何设计注册功能函数?
五、注册问题深入探究
def person(name,age,**kw):
print('name:',name,'age:',age,'other:',kw)
#只传入必选参数
person('Marry',30)#name:Marry age:30 other:{}
#传入任意其他参数,满足注册的需求
person('Bob',39,city='BeiJing')#name:Bob age 39 other:{'city':BeiJing},在这里kw是一个字典
person('Peter',40,gender='M',job='Engineer')#name:Peter age=40 other:{'gender':M,'job':'Engineer'}
#封装为字典,再传入参数
extra = {'city':'BeiJing','job':'Engineer'}
person('Jack',25,**extra)
#那么如果我想确定可选参数的名字怎么办呢?需要命名关键字参数
#用特殊符号*分隔,*后面的视为命名关键字参数
def person(name,age,*,city,job):
print('name:',name,'age:',age,'city:',city,'job:'job)
#调用
person('Jack',40,city='BeiJing',job='Engineer')#name:Jack age:40 city:BeiJing job:Engineer
#那么如果我输入的关键字参数既有大写又有小写,按照上面的方法出错了怎么办呢?
#考虑如果没有*是什么参数,yes,是位置参数
#这样就强制要求输入小写
def person(name,age,city,job):
pass
六、可变长度参数
#几种不同类型的参数可以混合使用,但是不建议这样做
def func_4(a,b,c=4,*aa,**bb):
print(a,b,c)
print(aa)
print(bb)
#调用
func_4(1,2,3,4,5,6,7,8,9,xx='1',yy='2','zz'='3')
#输出
(1,2,3)
(4,5,6,7,8,9)
{'xx':'1','yy':'2','zz':'3'}