Skip to content

Commit 0a9859e

Browse files
committed
para
1 parent 5c4ef45 commit 0a9859e

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

README.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,7 +1511,65 @@ list(range(10,-1,-1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
15111511

15121512
第三个参数为负时,表示从第一个参数开始递减,终止到第二个参数(不包括此边界)
15131513

1514+
#### 91 函数的五类参数使用例子
15141515

1516+
python五类参数:位置参数,关键字参数,默认参数,可变位置或关键字参数的使用。
1517+
1518+
```python
1519+
def f(a,*b,c=10,**d):
1520+
print(f'a:{a},b:{b},c:{c},d:{d}')
1521+
```
1522+
*默认参数`c`不能位于可变关键字参数`d`后.*
1523+
1524+
调用f:
1525+
```python
1526+
In [10]: f(1,2,5,width=10,height=20)
1527+
a:1,b:(2, 5),c:10,d:{'width': 10, 'height': 20}
1528+
```
1529+
可变位置参数`b`实参后被解析为元组`(2,5)`;而c取得默认值10; d被解析为字典.
1530+
1531+
再次调用f:
1532+
```python
1533+
In [11]: f(a=1,c=12)
1534+
a:1,b:(),c:12,d:{}
1535+
```
1536+
a=1传入时a就是关键字参数,b,d都未传值,c被传入12,而非默认值。
1537+
1538+
注意观察参数`a`, 既可以`f(1)`,也可以`f(a=1)` 其可读性比第一种更好,建议使用f(a=1)。如果要强制使用`f(a=1)`,需要在前面添加一个**星号**:
1539+
```python
1540+
def f(*,a,*b):
1541+
print(f'a:{a},b:{b}')
1542+
```
1543+
此时f(1)调用,将会报错:`TypeError: f() takes 0 positional arguments but 1 was given`
1544+
1545+
只能`f(a=1)`才能OK.
1546+
1547+
说明前面的`*`发挥作用,它变为只能传入关键字参数,那么如何查看这个参数的类型呢?借助python的`inspect`模块:
1548+
1549+
```python
1550+
In [22]: for name,val in signature(f).parameters.items():
1551+
...: print(name,val.kind)
1552+
...:
1553+
a KEYWORD_ONLY
1554+
b VAR_KEYWORD
1555+
```
1556+
1557+
可看到参数`a`的类型为`KEYWORD_ONLY`,也就是仅仅为关键字参数。
1558+
1559+
但是,如果f定义为:
1560+
```python
1561+
def f(a,*b):
1562+
print(f'a:{a},b:{b}')
1563+
```
1564+
查看参数类型:
1565+
```python
1566+
In [24]: for name,val in signature(f).parameters.items():
1567+
...: print(name,val.kind)
1568+
...:
1569+
a POSITIONAL_OR_KEYWORD
1570+
b VAR_POSITIONAL
1571+
```
1572+
可以看到参数`a`既可以是位置参数也可是关键字参数。
15151573

15161574
### 二 Python之坑
15171575

0 commit comments

Comments
 (0)