*和**使用
# 总共有以下用途
* 1 使用 * 将可迭代对象解包至列表/元组
* 2 使用 * 和 ** 向函数传递参数
* 3 使用 * 和 ** 捕捉传递至函数的参数
* 4 使用 ** 将字典解包至其他字典
* 5 使用 * 接受 keyword-only 参数
* 6 使用 * 捕捉元组解包过程中的项
## 1 使用 * 将可迭代对象解包至列表/元组
a= [2,1,2,4,5]
aa = [*a, 9,0]
aa
[2, 1, 2, 4, 5, 9, 0]
## 2 使用 * 和 ** 向函数传递参数, 解压可迭代对象
\*
操作符可用于将可迭代对象解包至函数调用的参数中 -> 可迭代对象被解包
\*\*
操作符允许我们使用键-值对字典,并在函数调用中将其解包为关键字参数 -> 解包为key=value
a= [2,1,2,4,5]
print(*a)
2 1 2 4 5
dic = {'a':1, 'b':2, 'c':3}
string = "{a}-{b}-{c}".format(**dic)
string
## 3 使用 * 和 ** 捕捉传递至函数的参数
在定义函数时,可以使用 *
操作符捕捉传递给函数的无限数量的位置参数。这些参数被捕捉到一个元组中。-> 被包装为元组
\*\*
操作符还有另一个用法:在定义函数时,我们可以使用 \*\*
将传递给函数的任何关键字参数捕捉到字典中: -> 被包装为字典
def test(*num):
print(type(num), num)
test(1,2,3,4)
<class 'tuple'> (1, 2, 3, 4)
def test(**num):
print(type(num), num)
test(a=1,b=2)
<class 'dict'> {'a': 1, 'b': 2}
## 5 使用 * 接受 keyword-only 参数
在 Python 3 中,有一种特殊的语法来接受 keyword-only 参数。Keyword-only 参数是只能使用关键字语法指定的函数参数,这意味着它们不能使用位置指定参数。
为了接受 keyword-only 参数,在定义函数时,我们可以在 *args
参数后,**kargs
参数前加上命名参数
keyword-only 参数的特性很酷,但是如果你希望在不捕获无限位置参数的情况下需要 keyword-only 参数呢?
Python 允许这样做,但它的语法有点奇怪,仅使用一个 *
,*
后面的所有参数都将作为关键字传递:
## 6 使用 * 捕捉元组解包过程中的项
Python 3 还添加了一种使用 *
操作符的新方法,这种方法只与定义函数与调用函数时使用 *
的特性有关。
*
操作符现在可以用于元组解包: