python函数传参
python函数传参
位置参数
常见的函数参数:
def add_both(x, y):
return x+y
默认参数
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll('tom','man',12,'shanghai')
# 输出
name: tom
gender: man
age: 12
city: shanghai
如果不按顺序时,需要把参数名加上:
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll(gender='woman',name='Pam',age=22,city='changsha')
# 输出
name: Pam
gender: woman
age: 22
city: changsha
使用默认参数的特点:
- 能降低调用函数的难度
- 必选参数在前,默认参数在后,否则会报错
- 当有多个参数时,把变化大的参数放前面,变化小的参数放后面,可以作为默认参数。
默认参数必须指向不变对象:
def add_end(L=[]):
L.append('END')
return L
add_end()
add_end()
# 输出
['END', 'END']
-
问题:连续调用函数,默认参数是[],但函数似乎每次都记住了上次添加了‘end’后的list
-
原因:默认参数L是一个变量,指向对象[],每次调用函数,如果改变了L的内容,则下次调用时,默认参数的内容改变了,不再是函数定义的[]
-
解决办法:默认参数都是None
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
add_end()
add_end()
# 输出
['END']
- 将参数设置为不变对象,对象内部的数据就不能修改。
可变参数
可变参数就是传入的参数个数是可变的,可以是任意的。
传统方式,可以传入list、tuple。
def cal_num(nums):
for i in nums:
print(i)
cal_num([1,2])
cal_num(('aaa','sss'))
cal_num('ssss')
# 输出
1
2
aaa
sss
s
s
s
s
可定义可变参数,是在参数前加一个*号,将其接收到参数值自动组装为一个tuple:
def cal_num(*nums):
for i in nums:
print(i)
cal_num(1,2)
cal_num([1,2])
cal_num(('aaa','sss'))
cal_num('ssss')
# 输出
1
2
[1, 2]
('aaa', 'sss')
ssss
如果有一个list或tuple,想要将其元素逐个传入函数中:
def cal_num(*nums):
for i in nums:
print(i)
nums = [1, 2]
cal_num(nums)
cal_num(*nums)
# 输出
[1, 2]
1
2
关键字参数
可定义关键词参数,是在参数前加一个**号,将传入的任意个参数值自动组装为一个dict,即类似于“键值对”:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person('Michael', 30)
person('Bob', 35, city='Beijing')
person('Adam', 45, gender='M', job='Engineer')
# 输出
name: Michael age: 30 other: {}
name: Bob age: 35 other: {'city': 'Beijing'}
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
命名关键字参数
命名关键字参数是限制关键字参数的名字,与关键字参数定义不同,只需要一个特殊分隔符*,后面的参数作为命名关键字参数。
def person(name, age, *, city, job):
print(name, age, city, job)
person('Michael', 30)
person('Bob', 35, city='Beijing')
person('Adam', 45, city='shanghai', job='Engineer')
# 输出
报错
报错
Adam 45 shanghai Engineer
- 命名关键字参数,不能是0参数,必须传入指定参数名的参数
如果函数定义中已经有了一个可变参数,后面的命名关键字参数就不再需要特殊分隔符(加上会报错):
def person(name, age, *args,city, job):
print(name, age, args, city, job)
person('Adam', 45,'M',city='shanghai', job='Engineer')
# 输出
Adam 45 ('M',) shanghai Engineer