读廖雪峰的 Python 教程小结--------Python函数

来源:互联网 发布:mysql创建唯一约束 编辑:程序博客网 时间:2024/05/19 02:21

其实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

默认参数,给某个参数给上默认值

但是有几点需要注意的:

  1. 必选参数在前,默认参数在后,否则Python的解释器会报错;
  2. 是如何设置默认参数。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
    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

原创粉丝点击