zoukankan      html  css  js  c++  java
  • python函数参数传递总结

    默认参数

    def enroll(name, gender, age=6, city='Beijing'):
        print('name:', name)
        print('gender:', gender)
        print('age:', age)
        print('city:', city)

    有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。

    也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('Adam', 'M', city='Tianjin'),意思是,city参数用传进去的值,其他默认参数继续使用默认值。

    def add_end(L=[]):
        L.append('END')
        return L

    >>> add_end()
    ['END''END']
    >>> add_end()
    ['END''END''END']

    Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
    定义默认参数要牢记一点:默认参数必须指向不变对象!
    要修改上面的例子,我们可以用None这个不变对象来实现:

    def add_end(L=None):
        if L is None:
            L = []
        L.append('END')
        return L

    可变参数

    def calc(*numbers):
        sum = 0
        for n in numbers:
            sum = sum + n * n
        return sum

    >>> calc(123)
    14
    >>> calc(1357)
    84

    定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

    >>> calc(12)
    5
    >>> calc()
    0

    如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:

    >>> nums = [123]
    >>> calc(nums[0], nums[1], nums[2])
    14

    这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:

    >>> nums = [123]
    >>> calc(*nums)
    14

    *nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
    关键字参数
    可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:

    def person(name, age, **kw):
        print('name:', name, 'age:', age, 'other:', kw)

    >>> person('Adam'45, gender='M', job='Engineer')
    name: Adam age: 45 other: {'gender''M''job''Engineer'}
    >>> extra = {'city''Beijing''job''Engineer'}
    >>> person('Jack'24, **extra)
    name: Jack age: 24 other: {'city''Beijing''job''Engineer'}

    extra表示把extra这个dict的所有key-value用关键字参数传入到函数的kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。
    命名关键字参数
    如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

    def person(name, age, *, city, job):
        print(name, age, city, job)

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

    调用方式如下:

    >>> person('Jack'24, city='Beijing', job='Engineer')
    Jack 24 Beijing Engineer

    命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

    >>> person('Jack'24'Beijing''Engineer')
    Traceback (most recent call last):
      File "<stdin>", line 1in <module>
    TypeError: person() takes 2 positional arguments but 4 were given

    组合参数
    在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
    def f1(a, b, c=0, *args, **kw):

    >>> f1(12)
    a = 1 b = 2 c = 0 args = () kw = {}
    >>> f1(12, c=3)
    a = 1 b = 2 c = 3 args = () kw = {}
    >>> f1(123'a''b')
    a = 1 b = 2 c = 3 args = ('a''b') kw = {}
    >>> f1(123'a''b', x=99)
    a = 1 b = 2 c = 3 args = ('a''b') kw = {'x'99}
    >>> f2(12, d=99, ext=None)
    a = 1 b = 2 c = 0 d = 99 kw = {'ext'None}

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

    >>> args = (1234)
    >>> kw = {'d'99'x''#'}
    >>> f1(*args, **kw)
    a = 1 b = 2 c = 3 args = (4,) kw = {'d'99'x''#'}
    >>> args = (123)
    >>> kw = {'d'88'x''#'}
    >>> f2(*args, **kw)
    a = 1 b = 2 c = 3 d = 88 kw = {'x''#'}

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

    import functools
    int2 = functools.partial(int, base=2)
    >>> int2('1000000')
    64

    简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
    偏函数也是用到args,*kw,将参数传递给所固定的函数,前提是所固定的函数要有该参数。

    个人公众号,有精选的学习资料,关注即可获得噢。

  • 相关阅读:
    Centos 7 zabbix 实战应用
    Centos7 Zabbix添加主机、图形、触发器
    Centos7 Zabbix监控部署
    Centos7 Ntp 时间服务器
    Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
    Kickstart 安装centos7
    Centos7与Centos6的区别
    Linux 150命令之 文件和目录操作命令 chattr lsattr find
    Linux 发展史与vm安装linux centos 6.9
    Linux介绍
  • 原文地址:https://www.cnblogs.com/python-dd/p/9368078.html
Copyright © 2011-2022 走看看