在Python中,*tuple和**dict代表什么?
概述:在很多python程序中,都会出现 *tuple 和 *dict的用法,这对于新手来说有点难懂,下面我做个简洁的说明。
1、当用在函数调用过程中时:
*t表示“将此元组的元素作为此函数调用的位置参数。
即:我们可以把 理解为 “脱衣法” ,把元组t的最外层的圆括号去掉,再传入值:
看以下实例:
def temp(x, y):
print(x + y)
a = (1, 8)
temp(*a)
# 输出:9
这里* a可以理解为先把(1,8)变成 1, 8 再分别传给函数temp中的参数x, y。
如果把上述程序段中的*a改成a则会报错:
def temp(x, y):
print(x + y)
a = (1, 8)
temp(a)
这是因为没有了* 号,程序会把把元组(1, 8)传给了参数x,而y参数没有传入值,所以报错了。
再看如果我们换成如下代码块:
def temp(x, y):
print(x + y)
a = ((1, 8),(1, 8))
temp(*a)
# 输出:(1, 8, 1, 8)
这里的* 号先把a“脱层衣服”,先拆成 (1, 8) 和(1, 8)再分别传给参数x,y。
另外:我们还能在list/tuple/set文本中执行此操作:
print([1, 2, *(3, 4), 5]) # 输出:[1, 2, 3, 4, 5]
print({'a', *('b','c'), 'd'}) # 输出:{'a', 'b', 'c', 'd'} 或其他无重复且包含abcd的集合
**d表示“将字典中的键值对视为此函数调用的附加命名参数
即:类似于上面, ** dict 可以理解为把字典的最外面的那层花括号“脱掉”。
看以下代码块:
def foo(x, y):
print(x, y)
d = {'x':1, 'y':2}
foo(**d)
# 输出:1 2
这里可以理解为,** d先把d变成 ‘x’:1, ‘y’:2,再把1,2分别传入函数foo()的参数x, y。
如果把上述程序段中的**d改成d同样会报错:
def foo(x, y):
print(x, y)
d = {'x':1, 'y':2}
foo(d)
报错原因类似于上面,程序把字典d赋给了x,而y没有进行传值。
还可以在字典文本中执行此操作:
print({'a':1, 'b':2, **{'c':3}})
# 输出:{'a': 1, 'b': 2, 'c': 3}
同理:**号脱掉{‘c’:3}的外衣"{}",剩下的’c’:3保留在大字典中。
2、在函数签名中:
*t表示“获取此函数的所有附加位置参数,并将它们作为元组打包到此参数中。”
看以下实例:
ef temp(*t):
print(t)
temp() # 输出:()
temp(1) # 输出:(1,)
temp(1,2,3) # 输出:(1, 2, 3)
即: * t使得参数t变得可选而不必要。
**d表示所有其他命名参数都加入到该函数中,并将它们作为字典条目插入到该参数中。
def do(**d):
print(d)
do() # 输出:{}
do(x=1, y=2) # 输出:{'x': 1, 'y': 2}
同样,**d使得传入的参数”可有可无“。
3、在赋值和for循环中:
*x的意思是“在右边使用额外的元素”,但它不一定是最后一项。注意x将始终是一个列表:
a, *a1 = (1, 2, 3, 4)
print(a) # 输出:1
print(a1) # 输出:[2, 3, 4]
*b1, b = (1, 2, 3, 4)
print(b) # 输出:4
print(b1) # 输出:[1, 2, 3]
c, *c1, d = (1, 2, 3, 4)
print(c) # 输出:1
print(c1) # 输出:[2, 3]
print(d) # 输出:4
以上就是一些关于*t和**dict的用法,还望各位大神指教!