# python3小白课:参数收集 ### 普通参数收集 python跟很多编程语言一样,支持定义个数可变的参数,这样定义起来很方便,也能支持处理多个传入的参数。 在定义形参的时候,我们可以在形参前面添加一个`*`星号用来表示这个形参支持接收多个参数值,多个参数值会自动组装成元组并传入,在函数内部我们就可以使用处理元组的方式来处理传入参数了。 ```python # coding:utf-8 def info(name, *nickname): print(f"您的名字为:{name}") print(f"您的昵称有这些:{nickname}") info("小白", "little bai", "白白", "小白白", "超级白") ``` 这里我们使用了f-string来格式化文本,这里的第一个参数被赋值给`name`这个形参,而后面不论增加赋值多少个参数,都会组合成元组,赋值给`nickname`,需要注意的是,在函数内部调用`nickname`的时候,不需要带`*`号。 > [!danger] > > 这种带一个`*`号的能收集参数的形参在同一个函数中仅能定义一个,因为多了解释器就不好识别并自动分配了。 这样的形参还能放在前面,我们看个例子: ```python # coding:utf-8 def info(*nickname, name): print(f"您的名字为:{name}") print(f"您的昵称有这些:{nickname}") info("little bai", "白白", "小白白", "超级白", name="小白") ``` 由于加`*`的形参支持读取可变个数的参数,因此其他的参数,解释器默认不能正常找到,如果我们要赋值给name参数,就必须使用关键字参数,而关键字参数需要在调用参数的最后来写,所以就写成了我们上述代码的样子。 --- ### 关键字参数收集 除了之前一个`*`的普通关键字收集,python函数在定义时,还支持在形参前加两个`*`号,即`**形参名`,这样写后,会将传入的关键字参数收集成字典,在函数内部可以调用。 > [!danger] > > 同样的,在同一个函数定义中,也只允许有一个关键字参数收集的参数定义。 > > 不过,关键字参数的收集可以跟普通参数收集同时存在。 具体的使用大家可以根据自己的业务场景来设计,我们来看个简单的使用。 ```python # coding:utf-8 def info(name, *nickname, **score): print(f"您的名字为:{name}") print(f"您的昵称有这些:{nickname}") print(f"您的成绩为:{score}") info("小白", "little bai", "白白", "小白白", "超级白", 语文=89, 数学=99) ``` 你也可以在函数内部使用字典的方法来获取内容。 --- ### 逆向参数收集 除了前面讲的正向的参数收集,python函数定义还支持逆向参数收集。 ```python # coding:utf-8 def info(name, nickname): print(f"您的名字为:{name}") print(f"您的昵称为:{nickname}") a = ["小白", "白白"] info(*a) ``` 我们再来看一个传入字典的逆向收集。 ```python # coding:utf-8 def info(name, nickname, score): print(f"您的名字为:{name}") print(f"您的昵称为:{nickname}") print(f"您的成绩为:{score}") a = { "name": "小白", "nickname": "白白", "score": 94 } info(**a) ``` 这样函数就会自动寻找字典中的键来匹配了。我尝试了一下,如果字典中多定义一个键,发现会报错的。所以函数需要哪几个,就传入哪几个键的字典就好了。 ### 单词释义 | 单词 | 释义 | | -------- | ---------- | | nickname | 昵称,外号 | | name | 姓名 | | score | 成绩 |