【3-2】函数——参数

一 参数

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

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

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除了必选参数nameage外,还接受关键字参数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

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值