【3-2】函数——参数

    xiaoxiao2021-03-25  136

    一 参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。

    对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了。函数内部的复杂逻辑被封装起来,调用者无需了解。

    1.默认参数

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

    其中n为默认参数,默认值为2。当调用power(5)时,相当于调用power(5, 2) :

    >>> power(5) 25 >>> power(5,3) 125

    1)设置默认参数时,有几点要注意:

    ①必选参数在前,默认参数在后,否则Python的解释器会报错。

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


    2)可以设置多个默认参数:

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

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

    >>> enroll('Sarah','F',7) name: Sarah gender: F age: 7 city: Beijing

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

    3)默认参数的陷阱

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

    当使用默认参数调用时:

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

    原因是:Python函数在定义的时候,默认参数l的值就被计算出来了,即[],因为默认参数l也是一个变量,它指向对象[]。每次调用该函数,如果改变了l的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

    所以,默认参数必须指向不变对象。

    解决办法:

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

    2.可变参数

    可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。

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

    在函数内部,参数numbers接收到的是一个tuple。因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

    >>> calc(1, 2) 5 >>> calc() 0

    还可以把list和tuple作为可变参数:

    >>> num = [1,2,3] >>> cacl(*num) 14

    3.关键字参数

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

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

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

    >>> person('Michael', 30) name: Michael age: 30 other: {}

    也可以传入任意个数的关键字参数:

    >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

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

    >>> kw = {'city': 'Beijing', 'job': 'Engineer'} >>> person('Jack', 24, **kw) name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

    4.关键字组合

    当同时调用以上四种参数时,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。

    比如定义一个函数,包含上述4种参数:

    def func(a,b,c=0,*arg,**kw): print 'a=',a, 'b=', b, 'c=', c, 'arg=', arg, 'kw=', kw

    在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去:

    >>> func(1,2) a= 1 b= 2 c= 0 arg= () kw= {} >>> func(1,2,3) a= 1 b= 2 c= 3 arg= () kw= {} >>> func(1,2,3,'a','b') a= 1 b= 2 c= 3 arg= ('a', 'b') kw= {} >>> func(1,2,3,'a',city = 'Beijing') a= 1 b= 2 c= 3 arg= ('a',) kw= {'city': 'Beijing'}

    通过一个tuple和dict,也可以调用该函数:

    >>> args = (1, 2, 3, 4) >>> kw = {'x': 99} >>> func(*args, **kw) a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}

    转自http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738449338c8a122a7f2e047899fc162f4a7205ea3000

    转载请注明原文地址: https://ju.6miu.com/read-6137.html

    最新回复(0)