欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

Python中的*和**

Python基础 迷途小书童 3年前 (2020-07-08) 2427次浏览 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)

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

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.