codeRose

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  Python函数参数可以是默认参数、可变参数和关键字参数,对于函数的调用者来说,无需关注函数内部,只需要知道如何传递正确的参数,以及函数将返回什么样的值。

1.位置参数

  自定义一个x*x的函数

def p(x):
    return x*x
# 对于p(x)函数,参数x是一个位置参数。
# 当调用这个函数是,必须传入有且仅有的一个参数
print(p(55))

控制台输出的值为3025

2.默认参数

  给位置参数赋值,设一个默认值。例如函数p1(x,n=3),调用函数p1是只需给位置参数x传递参数即可。

def p1(x,n=3):
    s=1
    while n>0:
        n=n-1
        s=s*x
    return s
print(p1(5))

  注意:必须是参数在前,默认参数在后,变化小的参数放在后面。变化小的参数可以作为默认参数。

  默认参数能降低函数的复杂度。

  例如写一个制定城市的用户注册的的函数,注册的信息包括:姓名,年龄,城市等信息。可以将城市信息设置成默认值。

  

def reg(name,age,city='北京'):
    print('name:', name)
    print('age:', age)
    print('city:', city)
# 只需传入参数name和age。
reg('rose',18)

  若需要注册不别的城市,只需给默认参数传入指定值即可。

def reg(name,age,city='北京'):
    print('name:', name)
    print('age:', age)
    print('city:', city)
# 只需传入参数name和age。
reg('rose',18)
# 只有与默认参数不符的用户才需要提供额外的信息
reg('jack',20,city='上海')

  默认参数很有用,但使用不当,也会掉坑里。默认参数有个最大的坑,演示如下:

先定义一个函数,传入一个list,添加一个END再返回:

当使用默认参数调用时,一开始结果也是对的。但是多次调用结果就不对了:

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

控制台打印结果为:

['END']
['END', 'END']
['END', 'END', 'END']

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

定义默认参数要牢记一点:默认参数必须指向不变对象!

3.可变参数

  可变参数就是传入的参数个数是可变的,可以是1个,2个或者是任意个,还可以是0个。

def nums(numbers):
    sum=0
    for n in numbers:
        sum=sum+n*n
    return sum
# 传入参数list
print(nums([1,2,3,4]))
# 传入参数tuple
print(nums((1,2,3,4)))

# 把函数的参数改为可变参数:在参数前面加*
def nums(*numbers):
    sum=0
    for n in numbers:
        sum=sum+n*n
    return sum
# 利用可变参数可以简化成:
print(nums(1,2,3,4))

 4.关键字参数

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

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

# 可以只传入必选参数
person('Bob', 35)
# 自动把关键字参数组装成dict
person('Bob', 35,city='shanghai')

运行结果:

name: Bob age: 35 other: {}
name: Bob age: 35 other: {'city': 'shanghai'}

5.命名关键字参数

  如果要限制关键字参数的名字,就可以用命名关键字参数,命名关键字参数用一个特殊分隔符*,*后面的参数被视为命名关键字参数。

# 命名关键字参数
def person1(name,age,*,city,job):
    print(name,age,city,job)
person1('rose',23,city='shanghai',job='worker')

运行结果:

rose 23 shanghai worker

  如果函数参数定义中已经有一个可变参数了,后面跟着的关键字参数就不再需要特殊分隔符了

def person2(name,*age,city,job):
    print(name,age,city,job)
person2('rose',23,city='shanghai',job='worker')

运行结果:

rose (23,) shanghai worker

注意:命名关键字参数必须传入参数名,否则调用报错。

6.参数组合

  在Python中定义函数,可以用必选参数,默认参数,可变参数,关键字参数和命名关键字参数这五种,可以组合使用,但注意的是,参数的顺序必须是:必选参数,默认参数,可变参数你,命名关键字参数和关键字参数。

  对于任意函数,都可以通过类似func(*args,**kw)的形式调用他。(命名关键字参数,关键字参数)

posted on 2017-11-25 22:29  codeRose  阅读(422)  评论(0编辑  收藏  举报