引言
在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入(打包)或变量的拆解,本文将详细介绍"星号参数"的用法。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
a = 2
b = 3
print(a*b) #6
print(a**b) #8
文章目录
- 参数元素的打包
- 参数元素的拆解
2.1 单星号变量实例
2.2 双星号变量实例 - 其他特殊用法
1. 参数元素的打包
最初,星号变量是用在函数的参数传递上的,在下面的实例中,单个星号代表这个位置接收任意多个非关键字参数(位置参数),在函数的*args位置上将其转化成元组,而双星号代表这个位置接收任意多个关键字参数,在**kwargs位置上将其转化成字典:
示例一:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def one(a,*args):
print(args)
def two(a,**kwargs):
print(kwargs)
one(1,2,3,4,5,6)
two(a=1,b=2,c=3,d=4,e=5,f=6)
程序输出:
(2, 3, 4, 5, 6)
{'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
示例二:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def func(*args,**kwargs):
print(args)
print(kwargs)
if __name__ == '__main__':
func(1,2,3,one=2,two=2)
程序输出结果:
(1, 2, 3)
{'one': 2, 'two': 2}
在了解了单星号和双星号的打包参数的方法后,下面来看看他们的参数拆解。
2. 参数元素的拆解
2.1 单星号参数拆解实例
单星号变量不仅仅能够用在函数的参数传递中,实际上对一个普通变量使用单星号前缀,能够将这个变量拆分成单个元素,请看下面的实例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def one(*args):
#print(args)
print(args[0])#输入传入参数的第一个元素
list=["a","b","c","d"]
str="www.baidu.com"
#程序输出:www.baidu.com,是元组('www.baidu.com', ['a', 'b', 'c', 'd'])的第一个元素
one(str,list)
#程序输出:a ,是元组('a', 'b', 'c', 'd')的第一个元素
one(*list)
#程序输出:w ,是元组('w', 'w', 'w', '.', 'b', 'a', 'i', 'd', 'u', '.', 'c', 'o', 'm')的第一个元素
one(*str)
如果在变量前面使用单星号,实际上是对变量的一次拆解操作,将变量中单独的元素拆解出来,然后依次传入one()函数,而传入one()函数后,one()函数会将这些传入的单个元素保存成一个元组,这就是为什么我们 print(args[0])能够提取第一个元素的原因。
为了验证这一点,我们修改一下one()函数,如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def one(*args):
print(args[0])
args[0]=8
list =[1,2,3,4,5,6,7]
one(list)
程序输出:TypeError: 'tuple' object does not support item assignment
我们知道列表是可以更改的,我们将列表拆分后传入one()函数,尝试在函数内部更改第一个元素的值,结果触发了"TypeError"异常,大家可以自己尝试下,出现这种结果的原因上面已经说明,不论传入的参数的原始类型是什么,one(args)在args的位置接收这些传入的参数后,都会将其保存成"元组",而元组是不能改变的。
再来看几个实例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def one(*args):
for i in args:
print(args)
dict={1:"one",2:"two",3:"three"}
if __name__ == '__main__':
one(*dict)
程序输出:
(1, 2, 3)
(1, 2, 3)
(1, 2, 3)
我们传入了一个字典元素,发现仅输出了字典元素的键,并没有包含值,实际上,单星号是无法读取到字典中的值的,永远只会读取到字典中的键,如果想读取到字典中的值,需要使用双星号。
2.2 双星号参数拆解实例
在第2小节的最后,我们使用单星号拆分了一个字典传递给函数,却只能得到字典的键,下面演示如何使用双星号来获得字典的值:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def func(**kwargs):
for i in kwargs:
print(i,"=",kwargs[i])
dict={"one":1,"two":2,"three":3}
if __name__ == '__main__':
func(**dict)
程序输出:
one = 1
two = 2
three = 3
3. 其他特殊用法之字典合并
关于字典的合并问题,除了常规的update()方法和for循环遍历赋值的方法,使用双星号可以快速的实现字典合并。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
x={'a':'1','b':'2','c':'5'}
y={'d':'1','b':'3','e':'6'}
z={**x,**y}
print(z) #输出:{'a': '1', 'b': '3', 'c': '5', 'd': '1', 'e': '6'}
并且,该方法中如果存在重复KEY值,后一位置的字典value值会覆盖前一位置value值。
本来汇总到Markdown笔记本里,咱们论坛的Markdown插件不是很兼容,格式比较怪,已经改了一些地方。兄弟们凑活看吧。
如果能给些“热心值”就更好了,先谢谢了。
一会再给兄弟们发一下Python的一些语法优雅写法和解析式的相关知识!