xian54966 发表于 2019-2-20 16:10

【笔记】Python中星号的特殊用法

本帖最后由 xian54966 于 2019-2-20 17:01 编辑

#引言
  在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入(打包)或变量的拆解,本文将详细介绍"星号参数"的用法。

```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位置上将其转化成字典:
示例一:
```python
#!/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)
```
  程序输出:
```python
(2, 3, 4, 5, 6)
{'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
```
示例二:
```python
#!/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)
```
  程序输出结果:
```python
(1, 2, 3)
{'one': 2, 'two': 2}
```
****
在了解了单星号和双星号的打包参数的方法后,下面来看看他们的参数拆解。
#2. 参数元素的拆解
##2.1 单星号参数拆解实例
单星号变量不仅仅能够用在函数的参数传递中,实际上对一个普通变量使用单星号前缀,能够将这个变量拆分成单个元素,请看下面的实例:
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def one(*args):
    #print(args)
    print(args)#输入传入参数的第一个元素

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)能够提取第一个元素的原因。
为了验证这一点,我们修改一下one()函数,如下:
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20
def one(*args):
    print(args)
    args=8

list =
one(list)
```
  程序输出:``TypeError: 'tuple' object does not support item assignment``
  我们知道列表是可以更改的,我们将列表拆分后传入one()函数,尝试在函数内部更改第一个元素的值,结果触发了"TypeError"异常,大家可以自己尝试下,出现这种结果的原因上面已经说明,不论传入的参数的原始类型是什么,one(*args)在*args的位置接收这些传入的参数后,都会将其保存成"元组",而元组是不能改变的。
****
  再来看几个实例:
```python
#!/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)
```
  程序输出:
```python
(1, 2, 3)
(1, 2, 3)
(1, 2, 3)
```
  我们传入了一个字典元素,发现仅输出了字典元素的键,并没有包含值,实际上,单星号是无法读取到字典中的值的,永远只会读取到字典中的键,如果想读取到字典中的值,需要使用双星号。
****
##2.2 双星号参数拆解实例
  在第2小节的最后,我们使用单星号拆分了一个字典传递给函数,却只能得到字典的键,下面演示如何使用双星号来获得字典的值:
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Xi on 2019-02-20


def func(**kwargs):
      for i in kwargs:
      print(i,"=",kwargs)


dict={"one":1,"two":2,"three":3}

if __name__ == '__main__':
    func(**dict)
```
   程序输出:
```python
one = 1
two = 2
three = 3
```
#3. 其他特殊用法之字典合并
  关于字典的合并问题,除了常规的update()方法和for循环遍历赋值的方法,使用双星号可以快速的实现字典合并。
```python
#!/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的一些语法优雅写法和解析式的相关知识!

xian54966 发表于 2019-2-20 21:50

本帖最后由 xian54966 于 2019-2-20 21:51 编辑

wanwfy 发表于 2019-2-20 21:38
大神能不能搞一个正则表达式的文章,很多教程看了感觉还是搞不明白
链接:https://pan.baidu.com/s/1DIycFFaw0-ajxJMjGEYJeA
提取码:zn39
看看这个视频可能会有帮助。别忘了加热心值啊!

小不点吃鱼 发表于 2019-2-20 16:15

好习惯,总结是很有必要的,能变成自己的东西

我操 发表于 2019-2-20 16:34

这就很牛逼了啊。学不完

52soft 发表于 2019-2-20 16:47

值得学习

763221847 发表于 2019-2-20 16:59

谢谢分享,值得一看!

wanwfy 发表于 2019-2-20 21:38

大神能不能搞一个正则表达式的文章,很多教程看了感觉还是搞不明白

林浩棉 发表于 2019-2-21 00:07

谢谢分享

lsir 发表于 2019-6-30 22:34

太厉害了。谢谢!

wuchen2138 发表于 2019-7-1 12:36

厉害厉害,学习了{:300_966:}
页: [1] 2
查看完整版本: 【笔记】Python中星号的特殊用法