Python中的*和**
阿新 • • 發佈:2020-10-12
Python中的*和**
Python進階迷途小書童3個月前 (07-08)0評論軟硬體環境
- ubuntu 18.04 64bit
- anaconda withpython3.7
視訊看這裡
前言
在python
中,*
和**
操作符出現的機率很高,新手在看別人的程式碼時可能會雲裡霧裡,本文就來看看*
和**
的作用以及常見的用法,他們倆是非常類似的,但為了清晰起見,還是分開來講
*操作符
主要是3種用途
- 用做運算子,即
*
表示乘號,如3 * 5
- 方法定義時,
*
號是放在引數的前面,傳入的任意個引數(可以是0)將會以元組的形式儲存 - 方法呼叫時的自動解包功能
(base) xugaoxiang@1070Ti:~$ i
python Python 3.7.6 (default, Jan 8 2020, 19:59:22) Type 'copyright', 'credits' or 'license' for more information IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: def f1(*arg): ...: print(type(arg)) ...: for item in arg: ...: print(item) ...: In [2]: f1(1, 2, 3, 'abc') <class 'tuple'> 1 2 3 abc In [3]:
從上面程式碼中可以看到arg
的型別是tuple
,所以使用tuple
的操作就可以對傳遞進來的引數進行操作。當你的方法需要一些引數,而你又不知道究竟會有多少的時候,使用*
號作為可變引數列表,就可以在方法內對引數進行呼叫
下面是自動解包功能的示例程式碼
In [6]: def add(a, b):
...: return a+b
...:
In [7]: param = (1, 2)
In [8]: add(*param)
Out[8]: 3
需要注意的是,在方法呼叫中,是可以多次使用*
的
In [20]: tup1 = (1, 2, 3) In [21]: tup2 = (4, 5, 6) In [22]: print(*tup1, *tup2) 1 2 3 4 5 6 In [23]:
**操作符
對應的也是3種用途
- 用做運算子,即
**
表示冪乘,如3 ** 5
- 方法定義時,
**
號是放在引數的前面,傳入的任意個帶關鍵字的引數(可以是0)將會以字典的形式儲存 - 方法呼叫時的自動解包功能
(base) xugaoxiang@1070Ti:~$ ipython
Python 3.7.6 (default, Jan 8 2020, 19:59:22)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def f2(**arg):
...: print(type(arg))
...: for item in arg:
...: print('key={}, value={}'.format(item, arg[item]))
...:
In [2]: f2(p='python', c='c', j='java', r='rust')
<class 'dict'>
key=p, value=python
key=c, value=c
key=j, value=java
key=r, value=rust
In [3]:
從上面程式碼中可以看到arg
的型別是dict
,所以使用dict
的相應操作就可以對傳遞進來的引數進行操作
跟*
類似,**
同樣也有自動解包的功能,示例程式碼如下
In [11]: def add(a, b):
...: return a+b
...:
In [12]: param = {"a":3, "b":4}
In [13]: add(**param)
Out[13]: 7
In [14]:
同樣的,在方法呼叫中,也是可以多次使用**
的,跟*
不一樣的是,與**
一起使用的每個字典中的鍵必須是不同的,否則會出現異常
In [24]: param1 = {"a":1, "b":2}
In [25]: param2 = {"c":3, "d":4}
In [26]: print('{a}, {b}, {c}, {d}'.format(**param1, **param2))
1, 2, 3, 4