欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

Python中的*和**

Python基础 迷途小书童 5年前 (2020-07-08) 3136次浏览 0个评论

软硬件环境

  • 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
喜欢 (0)

您必须 登录 才能发表评论!