Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ddd00a5

Browse files
committed
新增文章《如何规定函数参数类型?》
1 parent a79e237 commit ddd00a5

File tree

2 files changed

+256
-0
lines changed

2 files changed

+256
-0
lines changed

‎source/c05/c05_33.md‎

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# 5.33 如何规定函数的参数类型?
2+
3+
在定义函数时,通常都需要带有各样各样的参数。
4+
5+
## 认识参数的种类
6+
7+
从函数定义的角度来看,参数可以分为两种:
8+
9+
1. `必选参数`:调用函数时必须要指定的参数,在定义时没有等号
10+
2. `可选参数`:也叫`默认参数`,调用函数时可以指定也可以不指定,不指定就默认的参数值来。
11+
12+
例如下面的代码中,a 和 b 属于必选参数, c 和 d 属于可选参数
13+
14+
```python
15+
def func(a,b,c=0, d=1):
16+
pass
17+
```
18+
19+
从函数调用的角度来看,参数可以分为两种:
20+
21+
1. `关键字参数`:调用时,使用 key=value 形式传参的,这样传递参数就可以不按定义顺序来。
22+
2. `位置参数`:调用时,不使用关键字参数的 key-value 形式传参,这样传参要注意按照函数定义时参数的顺序来。
23+
24+
```python
25+
def func(a,b,c=0, d=1):
26+
pass
27+
28+
# 关键字参数传参方法
29+
func(a=10, c=30, b=20, d=40)
30+
31+
# 位置参数传参方法
32+
func(10, 20, 30, 40)
33+
```
34+
35+
最后还有一种非常特殊的参数,叫做`可变参数`
36+
37+
意思是参数个数可变,可以是 0 个或者任意个,但是传参时不能指定参数名,通常使用 `*args``**kw` 来表示:
38+
39+
- `*args`:接收到的所有按照位置参数方式传递进来的参数,是一个元组类型
40+
- `**kw` :接收到的所有按照关键字参数方式传递进来的参数,是一个字典类型
41+
42+
```python
43+
def func(*args, **kw):
44+
print(args)
45+
print(kw)
46+
47+
func(10, 20, c=20, d=40)
48+
```
49+
50+
输出如下
51+
52+
```
53+
(10, 20)
54+
{'c': 20, 'd': 40}
55+
```
56+
57+
## 两个神奇的符号
58+
59+
除了以上关于参数类型的基础知识,其实还有一个知识点,这是基础所有的 Python 基础教程都不会提及的。
60+
61+
仔细回看上面关于 `关键字参数``位置参数` 的区别,无需是在传参时是否以 key-value 的形式而不同。
62+
63+
这是从调用者的角度去区分,如果是这样,那你应该也会觉得 `关键字参数``位置参数` 这两个概率除了区分两种传参方式之外 ,好像没有实际的作用。
64+
65+
66+
67+
实则不然, `关键字参数``位置参数`
68+
69+
实际上,当你在定义函数时,函数是可以限定调用者该以何种方式来进行传参。
70+
71+
实现的方式就是依靠两个符号:
72+
73+
- `/`:在 `/` 之前的参数都是位置参数,不能以 key-value 传参,至于后面是什么参数它不管
74+
- `*`:在 `*` 之后都是关键字参数,都应该以 key-value 传参,至于前面是什么参数它也不管
75+
76+
下边以标准的正确示例和两个错误范例进行演示。
77+
78+
**正确示例**
79+
80+
```python
81+
def func(a,b,/,c,d):
82+
pass
83+
84+
func("a", "b", c="c", d="d")
85+
```
86+
87+
**错误示例一**
88+
89+
```python
90+
def func(a,b,/,c,d):
91+
pass
92+
93+
func("a", b="b", c="c", d="d")
94+
```
95+
96+
运行报错如下,意思是 b 是位置参数,不能使用 `b="b"` 这种 key-value 传参
97+
98+
```python
99+
Traceback (most recent call last):
100+
File "/Users/MING/demo.py", line 4, in <module>
101+
func("a", b="b", c="c", d="d")
102+
TypeError: func() got some positional-only arguments passed as keyword arguments: 'b'
103+
```
104+
105+
**错误示例三**
106+
107+
```python
108+
def func(a,b,*,c,d):
109+
pass
110+
111+
func("a", "b", "c", d="d")
112+
```
113+
114+
运行报错如下,意思是函数中只定义了两个位置参数,却给了三个,第三个是 c ,它是关键字参数,不能使用 `c="c"` 必须使用 key-value 传参
115+
116+
```python
117+
Traceback (most recent call last):
118+
File "/Users/MING/demo.py", line 4, in <module>
119+
func("a", "b", "c", d="d")
120+
TypeError: func() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given
121+
```
122+

‎source/c05/c05_33.rst‎

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
5.33 如何规定函数的参数类型?
2+
=============================
3+
4+
在定义函数时,通常都需要带有各样各样的参数。
5+
6+
认识参数的种类
7+
--------------
8+
9+
从函数定义的角度来看,参数可以分为两种:
10+
11+
1. ``必选参数``\ :调用函数时必须要指定的参数,在定义时没有等号
12+
2. ``可选参数``\ :也叫\ ``默认参数``\ ,调用函数时可以指定也可以不指定,不指定就默认的参数值来。
13+
14+
例如下面的代码中,a 和 b 属于必选参数, c 和 d 属于可选参数
15+
16+
.. code:: python
17+
18+
def func(a,b,c=0, d=1):
19+
pass
20+
21+
从函数调用的角度来看,参数可以分为两种:
22+
23+
1. ``关键字参数``\ :调用时,使用 key=value
24+
形式传参的,这样传递参数就可以不按定义顺序来。
25+
2. ``位置参数``\ :调用时,不使用关键字参数的 key-value
26+
形式传参,这样传参要注意按照函数定义时参数的顺序来。
27+
28+
.. code:: python
29+
30+
def func(a,b,c=0, d=1):
31+
pass
32+
33+
# 关键字参数传参方法
34+
func(a=10, c=30, b=20, d=40)
35+
36+
# 位置参数传参方法
37+
func(10, 20, 30, 40)
38+
39+
最后还有一种非常特殊的参数,叫做\ ``可变参数``\
40+
41+
意思是参数个数可变,可以是 0
42+
个或者任意个,但是传参时不能指定参数名,通常使用 ``*args`` 和 ``**kw``
43+
来表示:
44+
45+
- ``*args``\ :接收到的所有按照位置参数方式传递进来的参数,是一个元组类型
46+
- ``**kw``
47+
:接收到的所有按照关键字参数方式传递进来的参数,是一个字典类型
48+
49+
.. code:: python
50+
51+
def func(*args, **kw):
52+
print(args)
53+
print(kw)
54+
55+
func(10, 20, c=20, d=40)
56+
57+
输出如下
58+
59+
::
60+
61+
(10, 20)
62+
{'c': 20, 'd': 40}
63+
64+
两个神奇的符号
65+
--------------
66+
67+
除了以上关于参数类型的基础知识,其实还有一个知识点,这是基础所有的
68+
Python 基础教程都不会提及的。
69+
70+
仔细回看上面关于 ``关键字参数`` 和 ``位置参数``
71+
的区别,无需是在传参时是否以 key-value 的形式而不同。
72+
73+
这是从调用者的角度去区分,如果是这样,那你应该也会觉得 ``关键字参数`` 和
74+
``位置参数`` 这两个概率除了区分两种传参方式之外 ,好像没有实际的作用。
75+
76+
实则不然, ``关键字参数`` 和 ``位置参数``
77+
78+
实际上,当你在定义函数时,函数是可以限定调用者该以何种方式来进行传参。
79+
80+
实现的方式就是依靠两个符号:
81+
82+
- ``/``\ :在 ``/`` 之前的参数都是位置参数,不能以 key-value
83+
传参,至于后面是什么参数它不管
84+
- ``*``\ :在 ``*`` 之后都是关键字参数,都应该以 key-value
85+
传参,至于前面是什么参数它也不管
86+
87+
下边以标准的正确示例和两个错误范例进行演示。
88+
89+
**正确示例**
90+
91+
.. code:: python
92+
93+
def func(a,b,/,c,d):
94+
pass
95+
96+
func("a", "b", c="c", d="d")
97+
98+
**错误示例一**
99+
100+
.. code:: python
101+
102+
def func(a,b,/,c,d):
103+
pass
104+
105+
func("a", b="b", c="c", d="d")
106+
107+
运行报错如下,意思是 b 是位置参数,不能使用 ``b="b"`` 这种 key-value
108+
传参
109+
110+
.. code:: python
111+
112+
Traceback (most recent call last):
113+
File "/Users/MING/demo.py", line 4, in <module>
114+
func("a", b="b", c="c", d="d")
115+
TypeError: func() got some positional-only arguments passed as keyword arguments: 'b'
116+
117+
**错误示例三**
118+
119+
.. code:: python
120+
121+
def func(a,b,*,c,d):
122+
pass
123+
124+
func("a", "b", "c", d="d")
125+
126+
运行报错如下,意思是函数中只定义了两个位置参数,却给了三个,第三个是 c
127+
,它是关键字参数,不能使用 ``c="c"`` 必须使用 key-value 传参
128+
129+
.. code:: python
130+
131+
Traceback (most recent call last):
132+
File "/Users/MING/demo.py", line 4, in <module>
133+
func("a", "b", "c", d="d")
134+
TypeError: func() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /