引言

  在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

文章目录

  1. 参数元素的打包
  2. 参数元素的拆解
    2.1 单星号变量实例
    2.2 双星号变量实例
  3. 其他特殊用法

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的一些语法优雅写法和解析式的相关知识!