1. 程式人生 > 實用技巧 >Python中的*和**

Python中的*和**

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