python中’*’和’**’的使用分两个方面,一个是计算,另一个是参数传递过程中元素的打包和解包。 

计算方面

‘*’和’**’在python中最常见的作用分别是‘相乘’和‘乘幂’,如下:

>>> a  = 2
>>> b = 3
>>> c = 5*6
>>> d = 4**3
>>> e = a*b
>>> f = a**b

传递、打包、解包方面

函数的可变参数

  • 对函数传递的参数进行打包(成元组tuple或字典dictionary)和拆解(分解成单个元素),其中元组的打包和解包使用单星号‘*’,字典的打包和拆解使用’**’。
  • 打包,就是将传递给函数的任意多个(也可以是零个)非关键字参数/关键字参数打包成一个元组/字典(元组只能接收非关键字参数,字典只能接收关键字参数)

当函数的参数前面有一个星号*的时候表示这是一个可变的位置参数,两个星号**表示是可变的关键字参数。

def foo(*args, **kwarg):
for item in args:
print item for k,v in kwarg.items():
print k,v
print 30*'='
if __name__ == '__main__':
foo(1, 2, 3, a=4, b=5)
foo(2, 3, a=4, b=5, c=1)

输出如下:

C:\Users\BigTree\AppData\Local\Programs\Python\Python36\python.exe "C:/Python S8/develops/Day 2 控制语句/星号用法.py"
1
2
3
a 4
b 5
**************************************************
2
3
a 4
b 5
c 1
************************************************** Process finished with exit code 0

这样我们可以传入任意个数的参数。

解包/打散(unpack)参数

  • 拆解,就是将传递给函数的一个列表、元组或字典拆分成独立的多个元素然后赋值给函数中的参变量(包括普通的位置参数,关键字参数,元组也即*非关键字参数,字典也即**关键字参数)。
  • 在解字典时会有两种解法,一种使用*解,解出来传给函数的只有键值(.key)另一种是用**解,解出来的是字典的每一项。

星号*把序列/集合解包(unpack)成位置参数,两个星号**把字典解包成关键字参数

下面通过示例来进一步加深理解:

def foo(*args, **kwarg):
for item in args:
print(item)
for k,v in kwarg.items():
print(k, v)
print('*' * 50) if __name__ == '__main__':
#foo(1, 2, 3, a=4, b=5)
#foo(2, 3, a=4, b=5, c=1)
v = (1, 2, 4)
v2 = [11, 15, 23]
d = {'a':1, 'b':12}
foo(v, d)
foo(*v, **d)
foo(v2, d)
foo(*v2, **d)

输出如下:

C:\Users\BigTree\AppData\Local\Programs\Python\Python36\python.exe "C:/Python S8/develops/Day 2 控制语句/星号用法.py"
(1, 2, 4)
{'a': 1, 'b': 12}
**************************************************
1
2
4
a 1
b 12
**************************************************
[11, 15, 23]
{'a': 1, 'b': 12}
**************************************************
11
15
23
a 1
b 12
************************************************** Process finished with exit code 0

上面的示例中如果v、v2、d没有加星号那么就当成了一个参数传递给了函数,如果加了星号那么就会解包后传递给函数。

foo(*d, **d)等价于foo(1, 2, 4, a=1, b=12)

几个注意点

可变位置参数*args是一个元组,是不可修改的。

>>> def foo(*args):
... args[0] = 5
...
>>> foo(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
TypeError: 'tuple' object does not support item assignment
>>> l = [1, 2, 3]
>>> foo(*l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
TypeError: 'tuple' object does not support item assignment

无论我们怎么传入参数,args都是一个tuple类型,不能进行修改。 
对于字典类型的如果只使用一个型号*那么传入的只是字典的键。

>>> def foo2(*args, **kwarg):
... print args, kwarg
...
>>> d = {'a':1, 'b':2, 'c':3}
>>> foo2(*d)
('a', 'c', 'b') {}
>>> foo2(**d)
() {'a': 1, 'c': 3, 'b': 2}

参考链接:http://blog.csdn.net/xiaoqu001/article/details/78823498

Python 中星号作用:解包&打散的更多相关文章

  1. Python中的参数解包:`*`表达式和 `**`表达式

    目录 1.参数解包:方法调用中的*表达式和**表达式 2.参数解包:方法定义中的*表达式和**表达式 3.在元组,列表,集合和字典中解包 4.Extended Unpacking:赋值表达式左边的*表 ...

  2. Ruby中星号打包解包操作

    Ruby中可以使用一个星号*和两个星号**完成一些打包.解包操作,它们称为splat操作符: 一个星号:以数组为依据进行打包解包(参考文章) 两个星号:以hash为依据进行打包解包(参考文章) 两个星 ...

  3. Python中星号的本质和使用方式

    翻译:Python 开发者 - 一汀, 英文:Trey Hunner http://blog.jobbole.com/114655/ Python开发者 在 Python 中有很多地方可以看到*和** ...

  4. python基础之打/解包及运算符与控制流程

    python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...

  5. Python中dict详解

    from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...

  6. Python 中的时间处理包datetime和arrow

    Python 中的时间处理包datetime和arrow 在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年.月.日等 # 方法一: today = datetime.date.today ...

  7. python中星号变量的几种特殊用法

    python中星号变量的几种特殊用法 不知道大家知不知道在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入 ...

  8. python中常用的导包的方法和常用的库

    python中常用的导包的方法               导入包和包名的方法:1.import package.module 2.from package.module import  * 例一: ...

  9. Python特色的序列解包、链式赋值、链式比较

    一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...

随机推荐

  1. json2.js

    /* http://www.JSON.org/json2.js 2010-03-20 Public Domain. NO WARRANTY EXPRESSED OR IMPLIED. USE AT Y ...

  2. tcp/ip--IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)

    IP 数据报首部 最高位在左边,记为0 bit:最低位在右边,记为31 bit 版本: 占 4 位,指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4) 首部长度: 占4位,可表示的最 ...

  3. Python标准库:内置函数chr(i)

    返回一个參数i表示的字符串. 比方,chr(97)返回字符"a".參数i的有效范围为0到1.114,111(0x10FFFF),其他范围的值会抛出异常ValueError. 与之相 ...

  4. JavaScript之引用类型

    js中的引用类型和其他语言中类的概念很相似,但并不一样. 引用类型是一种数据结构,就像房子的骨架,承载着数据和功能的衔接. 而对象,则是引用类型的具体实现,即实例. var person = new ...

  5. 推荐vim配置

    "设置编码,处理中文乱码,文件默认utf8编码set fileencodings=utf-8,ucs-bom,cp936,big5 "设置默认配色方案colorscheme def ...

  6. raw flash vs FTL

    1. 区别 raw flash devices: NAND, NOR, OneNAND, etc,其被作为MTD设备处理(既不是字符设备,也不是块设备). FTL device:Flash Trans ...

  7. ini_set() php.ini设置的功能

    ini_set()具有更改php.ini设置的功能.此函数接收两个参数:需要调整的配置变量名,以及变量的新值. [c-sharp] view plaincopyprint? <?php ini_ ...

  8. JavaScript-4.5 事件大全,事件监听---ShinePans

    绑定事件 <input type="bubtton" onclick="javascript:alert('I am clicked');"> 处理 ...

  9. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights

    第一次提交遇到这样的情况,怎么回事呢,我在github上提交了ssh key 的啊. 排查先看看能不能解析, 1.先 ping https://github.com 把ip添加到 host :    ...

  10. 我的第二个java程序 循环

    public class Test {//类 public Test (int num){//构造方法,和类同名,无返回值,接收传参并定义传参的类型,大小写敏感 int x = 10;//局部变量,定 ...