101 lines
3.5 KiB
Markdown
101 lines
3.5 KiB
Markdown
# 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 | 成绩 | |