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)的形式调用他。(命名关键字参数,关键字参数)