吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5535|回复: 11
收起左侧

[Python 转载] 【笔记】Python中星号的特殊用法

  [复制链接]
xian54966 发表于 2019-2-20 16:10
本帖最后由 xian54966 于 2019-2-20 17:01 编辑

引言

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

免费评分

参与人数 10吾爱币 +11 热心值 +9 收起 理由
阿拉丁007 + 1 + 1 热心回复!
微微笑95 + 1 我很赞同!
nsoshhy + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hustlzp + 2 + 1 用心讨论,共获提升!
kallen + 1 + 1 我很赞同!
asdf1233124 + 1 + 1 谢谢@Thanks!
antu078 + 1 + 1 谢谢@Thanks!
154675361 + 1 用心讨论,共获提升!
liuqm + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
厉害厉害,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 14:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表