# 函数参数
# 参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数
#===================================================
# 默认参数,及普通参数在函数调用时的规则
def student(name, gender, age=10, city='beijing'):
print('name:', name, ',gender:', gender, ',age:', age, ',city:', city)
# 采用如下方式可以不管函数定义时参数列表的顺序
student(name='xiaoming', gender='M') # name: xiaoming ,gender: M ,age: 10 ,city: beijing
student(gender='M', name='xiaoming') # name: xiaoming ,gender: M ,age: 10 ,city: beijing
student('xiaoming', 'M', 'wuhan') # name: xiaoming ,gender: M ,age: wuhan ,city: beijing
student('xiaoming', 'M', 9, 'wuhan') # name: xiaoming ,gender: M ,age: 9 ,city: wuhan
# 如需跳过age直接给city赋值,方式如下
student('xiaoming', 'M', city='wuhan') # name: xiaoming ,gender: M ,age: 10 ,city: wuhan
#===================================================
# 默认参数的一个坑
def append(l=[]):
l.append('End')
print(l)
append() # ['End']
append() # ['End', 'End']
# 注:上面两行代码直观上像是默认参数初始值改变了,
# 其实默认参数l在两次调用其代表的对象都是函数初始化
# 时产生的列表,只是这个列表的内容发生了变化
# 解决方法,如下
def append_no_bug(l=None):
if l is None:
l = []
l.append('End')
print(l)
append_no_bug() # ['End']
append_no_bug() # ['End']
#===================================================
# 可变参数和(列表、元组)类型参数的区别
def numbers(numbers):
print(sum(numbers))
def numbers_mutable(*numbers):
print(sum(numbers))
# numbers(1,2,3) #TypeError: numbers() takes 1 positional argument but 3 were given
numbers([1, 2, 3]) # 6
numbers((1, 2, 3)) # 6
numbers_mutable(1, 2, 3) # 6
# numbers_mutable([1,2,3]) #TypeError: unsupported operand type(s) for +: 'int' and 'list'
a = [1, 2, 3, 4]
numbers_mutable(a[0], a[1], a[2], a[3]) # 10
numbers_mutable(*a) # 10
#===================================================
# 关键字参数
def person(name, age, **other):
print('name:', name, ',age:', age, ',other:', other)
person('Yue', 18) # name: Yue ,age: 18 ,other: {}
person('Yue', 18, city='wuhan') # name: Yue ,age: 18 ,other: {'city': 'wuhan'}
other = {'city': 'wuhan', 'province': 'hubei'}
person('Yue', 18, **other) # name: Yue ,age: 18 ,other: {'city': 'wuhan', 'province': 'hubei'}