其实Python的函数不难,重点不是在函数的调用,和函数的定义。我觉得重点在与定义函数的时候定义函数参数
主要分:
1. 位置参数
2. 默认参数
3. 可变参数
4. 关键字参数
5. 命名关键字参数
位置参数,就是普通的函数的定义啊
def abs(x):
if x>0:
return x
else:
return -x
def max(x , y):
if x>y:
return x
else:
return y
默认参数,给某个参数给上默认值
但是有几点需要注意的:
- 必选参数在前,默认参数在后,否则Python的解释器会报错;
- 是如何设置默认参数。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
def power(x , n=2):
i=0
sum=1
while i>n:
sum = sum*x
return sum
当有多个默认参数的时候,调用的时候要按照默认参数的顺序调用,当然也可以不按照顺序,但是调用的时候就要做一些改变
比如:
def setStudent(name , age=8 , city="Guangzhou"):
print("name:%s" % name)
print("age :%s" % age)
print("city:%s" % city)
>>>setStudent("KIM")
....
....
>>>setStudent("KIM" , 9 , "Shanghai")
....
....
>>>setStudent("KIM" , city="Beijing") #跳过了age
最后要注意的是:默认参数必须指向不变对象!!!
可变参数,就是参数是不定的,你可以给任意的参数数量
#只需要在参数前加上一个*,就变成可变参数了
#在函数内部,参数numbers接收到的是一个tuple
#即是numbers是一个tuple(数组)
def max(*numbers):
max=0
for n in numbers:
if n > max:
max = n
return max
调用方法也有几种:
Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去
>>>max(5,6,9,7)
...
...
>>>L=[1,2,3,4]
>>>T=(2,3,4,5)
>>>max(*L)
...
...
>>>max(*T)
...
...
关键字参数
关键字参数其实和可变参数差不多,只不过可变参数是把参数自动组装为一个tuple,而关键字参数在函数内部自动组装为一个dict
- 可变参数———–tuple
- 关键字参数——–dict
在参数前面家两个*,就是关键字参数
当然我们调用的时候,传入参数的形式也是以键值对的方式传入
def setPersonInfo(name , age , **kw):
pass
>>>setPersonInfo("KIM" , 8)
...
...
>>>setPersonInfo("KIM" , 8 , city="Beijing" , job="teacher")
...
...
>>> extra = {'city': 'Beijing', '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不同,命名关键字参数需要一个特殊分隔符,*后面的参数被视为命名关键字参数
def setPersonInfo(name , age , * , city , job):
pass
#必须要键值对方式传入,并且是规定好的,不能任意,否则会报错
>>> person('Jack', 24, city='Beijing', job='Engineer')
当然也有特殊情况,比如说:
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def person(name, age, *args, city, job):
pass
看出如果在可变参数后边的位置参数其实是命名关键字参数,要以键值对方式传入,否则会被当做可变参数的
>>>person("KIM" , 8 , city="Guangzhou" , job="teacher")
...
...
>>>person("KIM" , 8 , "傻瓜" , city="Guangzhou" , job="teacher")
...
...
当然命名关键字参数也可以具有默认值,那在调用的时,就可不传入有默认值的参数
def person(name, age, *args, city="Guangzhou", job):
pass
def person(name, age, * , city="Guangzhou", job):
pass
>>>person("KIM" , 8 , job="teacher")
...
...
总结
位置参数————普通参数
默认参数————给参数默认值,调用的时候可以不传参数
可变参数————不定参数的个数 ,以tuple方式传入, *args
关键字参数———和可变参数差不多 , 以 dict 方式传入 **kw
命名关键字参数—–关键字参数的升级版,参数定长,以dict传入,但是必须以规定的参数名传入 ,*,job