软硬件环境
- ubuntu 18.04 64bit
- anaconda with python 3.7
视频看这里
此处是 youtube
的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。
前言
在 python
中,*
和 **
操作符出现的几率很高,新手在看别人的代码时可能会云里雾里,本文就来看看 *
和 **
的作用以及常见的用法,他们俩是非常类似的,但为了清晰起见,还是分开来讲
*操作符
主要是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 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