4、参数收集和逆向参数收集
1)参数收集
(1)*参数
说明:
- 在形参前面添加一个星号(*),意味着该参数可接受多个参数值
- Python 将传给带 * 参数的多个值收集成一个元组
- Python 允许参数收集的形参位于形参列表的任意位置,但只能带一个支持“普通”参数收集的形参
- 若支持“普通”参数收集的形参位于前面,后面的参数则需要使用关键字参数传值
def test(num, *books):
print('num:', num)
print('books:', books)
print(3, 'python', 'java', 'c')
num: 3
books: (‘python’, ‘java’, ‘c’)
def test(*books, num):
print('books:', books)
print('num:', num)
test('python', 'java', 'c', num=3)
books: (‘python’, ‘java’, ‘c’)
num: 3
(2)**参数
说明:
- 在参数前面添加两个星号(**), 该参数支持关键字参数收集,收集的参数别当成 dict 处理
- 一个函数可同时支持普通参数收集和关键字参数收集
def test(num, *books, **scores):
print('num:', num)
print('books:', books)
print('scores:', scores)
test(3, 'python', 'java', 'c', py=90, ja=80)
num: 3
books: (‘python’, ‘java’, ‘c’)
scores: {‘py’: 90, ‘ja’: 80}
def test(*books, num, **scores):
print('books:', books)
print('num:', num)
print('scores:', scores)
test('python', 'java', 'c', num=3, py=90, ja=80)
books: (‘python’, ‘java’, ‘c’)
num: 3
scores: {‘py’: 90, ‘ja’: 80}
2)逆向参数收集
说明:在列表、元组前添加 *,在字典前添加 **。
def test(a, b):
print(a)
print(b)
vals_1 = (10, 20)
# 调用函数时,Python 不会对元组自动解包(默认情况下,元组是一个整体)
# * 对元组进行解包(逆向参数收集)
test(*vals_1)
10
20
# * 对列表进行解包
vals_2 = [10, 20]
test(*vals_2)
10
20
# ** 对字典解析成关键字参数
vals_3 = {'a':10, 'b':20}
test(**vals_3)
10
20