正确理解python ** 双星 和 * 单星

如果我们经常看一些python包的原始的代码,经常会发现 他们定义的方法会在最后参数列表位置 包含 *args 或者 **kwargs, 这样的书写可以增加方法的健壮性,除了必须要的参数和默认参数,多余的参数再多也不会报错,,那我们还是 需要理解一下 ** *

单星 *
1.一般用在 元组 tuple 和list 列表,加上* 以后等于给他 加上了 位置属性, 类似索引
举例

def foo(a,b):
    print(a+b)
pos_list=(3,54)

pai_list=(3,54,21,34)
foo(*pos_list)

本来 函数 foo 需要两个参数 a 和b ,刚好你有 两个列表pos_list 有两个元素,pai_list有四个元素,
如果你直接 foo(pos_list) 是报错的,foo 需要的是两个参数,而且根据函数体,我们可以判断需要的是数字类型的变量,你传入一个列表就当然报错了,
怎么办,把列表的元素取出来呢
最简单就是这样,把列表的元素按索引取出来
foo( pos_list[0], pos_list[1]),这个是可以正常执行的,不过未免有点低效,
有没有办法 直接把 pos_list[0]映射给参数a, pos_list[1]映射给参数b ?

当然有 就是 列表前加星号* ,有点像c语言取地址符 ,这样列表 其实就带了position属性
只要列表的元素个数和 参数个数相等,就可以一一对应。
foo(*pos_list) 可以正常执行

那如果 列表元素个数超过 参数个数,直接加星号就会报给的参数过多的错误, 不过我们可以使用切片 的方法来解决

def foo(a,b):
    print(a+b)

pai_list=(3,54,21,34)
foo(*pai_list[0:2])

2.单星也会用在循环中,比如 合并两个或者多个list

pos_list=(3,54)

pai_list=(3,54,21,34)

res_list=[  *pos_list,*pai_list]
print(res_list)
>>  [3, 54, 21, 34, 3, 54]

tuple_res=(*lis,*lisz)
print(tuple_res)
>> (3, 54, 21, 34, 3, 54)

双星 **
1.双星 主要是应用在键值对上,一般就是字典dict ,加两个星 这个其实就是把字典的key 映射为函数参数名,value 映射为参数值,这里有一个条件,就是 key 要和参数名 对应上, 否则会报错,而且 数据类型也要保证是对应的

def foo(a,b):
    print(a+b)

dic={'a':56,'b':45}
foo(**dic)

2.双星 会应用到循环上 会是 非常高效和优雅的方式
比如你打算合并两个 字典 dict_1 dict_2

dic_1={'a':56,'b':45}
dic_2={'c':26,'d':15}
dic_res={ **dic_1,**dic_2}

print(dic_res)
>>
{'a': 56, 'c': 26, 'b': 45, 'd': 15}

需要注意的是如果两个字典出现重复key 的话,有一个会被覆盖掉
基于这种方式 你甚至可以一口气合并七八个字典

dic_1={'a':56,'b':45}
dic_2={'c':26,'d':15}
dic_3={'e':26,'r':15}
dic_res={ **dic_1,**dic_2,**dic_3}

print(dic_res)
>> {'e': 26, 'd': 15, 'r': 15, 'a': 56, 'b': 45, 'c': 26}

3 在函数声明中看到 参数 单星和双星 含义就是 单星意味着 接受不定参数,并且把这些不定参数当做tuple来处理,双星参数则意味着 接受不定参数的键值对,并且把键映射为参数名,值映射为参数值 或者说 如果你输入了 多个参数及值,则会把他映射成字典dict


def foo(*t):
    print(t)

>>> foo(1, 2)
(1, 2)

def foo(**d):
    print(d)

>>> foo(x=1, y=2)
{'y': 2, 'x': 1}

dic_1={'a':56,'b':45}
foo(**dic_1)
>>{'a':56,'b':45} 

另外 * 作为列表的不定参数子集存在

>>> x, *xs = (1, 2, 3, 4)
>>> x
1
>>> xs
[2, 3, 4]

>>> *xs, x = (1, 2, 3, 4)
>>> xs
[1, 2, 3]
>>> x
4

>>> x, *xs, y = (1, 2, 3, 4)
>>> x
1
>>> xs
[2, 3]
>>> y
4

>>> for (x, *y, z) in [ (1, 2, 3, 4) ]: print(x, y, z)
...
1 [2, 3] 4

参考

In a function call
*t means "treat the elements of this tuple as positional arguments to this function call."

def foo(x, y):
    print(x, y)

>>> t = (1, 2)
>>> foo(*t)
1 2
Since v3.5, you can also do this in a list/tuple/set literals:

>>> [1, *(2, 3), 4]
[1, 2, 3, 4]
**d means "treat the key-value pairs in the dictionary as additional named arguments to this function call."

def foo(x, y):
    print(x, y)

>>> d = {'x':1, 'y':2}
>>> foo(**d)
1 2
Since v3.5, you can also do this in a dictionary literals:

>>> d = {'a': 1}
>>> {'b': 2, **d}
{'b': 2, 'a': 1}
In a function signature
*t means "take all additional positional arguments to this function and pack them into this parameter as a tuple."

def foo(*t):
    print(t)

>>> foo(1, 2)
(1, 2)
**d means "take all additional named arguments to this function and insert them into this parameter as dictionary entries."

def foo(**d):
    print(d)

>>> foo(x=1, y=2)
{'y': 2, 'x': 1}
In assignments and for loops
*x means "consume additional elements in the right hand side", but it doesn't have to be the last item. Note that x will always be a list:

>>> x, *xs = (1, 2, 3, 4)
>>> x
1
>>> xs
[2, 3, 4]

>>> *xs, x = (1, 2, 3, 4)
>>> xs
[1, 2, 3]
>>> x
4

>>> x, *xs, y = (1, 2, 3, 4)
>>> x
1
>>> xs
[2, 3]
>>> y
4

>>> for (x, *y, z) in [ (1, 2, 3, 4) ]: print(x, y, z)
...
1 [2, 3] 4

https://stackoverflow.com/questions/21809112/what-does-tuple-and-dict-means-in-python

https://python-reference.readthedocs.io/en/latest/docs/operators/dict_unpack.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 一、python 变量和数据类型 1.整数 Python可以处理任意大小的整数,当然包括负整数,在Python程序...
    绩重KF阅读 1,648评论 0 1
  • 最近在慕课网学习廖雪峰老师的Python进阶课程,做笔记总结一下重点。 基本变量及其类型 变量 在Python中,...
    victorsungo阅读 1,656评论 0 5
  • (一)、主要内容 1.1、列表 1.2、元祖 1.3、字典 1.4、集合列表 、字典、元祖、集合 (二)、列表 2...
    IIronMan阅读 3,543评论 0 7
  • 今天在家陪儿子一起学习,整个上午我也在认真的看书,看书是我年少时的最爱,每天如痴如醉,但那时候书又很少,只...
    细雨飞纷阅读 81评论 2 3
  • 想请教一下大家,“群居有什么好处?” 为了工作顺利要去和同事上级们搞好关系,过年一大群亲戚要聚在一起,还有什么酒桌...
    半理阅读 185评论 0 0