python函数参数,序列解包

时间:2025-05-08 07:30:17

传递参数是的序列解包

序列解包是非常重要且常用的一个功能。

>>> lt = [1,2,3]
>>> a, b, c = lt
>>> print(a,b,c)
1 2 3
>>> x, y, z = 1, 2, 3
>>> print(x,y,z)
1 2 3
>>> a_tuple=tuple(range(3))
>>> x,y,z = a_tuple
>>> print(x,y,z)
0 1 2
>>> x, y, z = map(str, range(3))

在Python列表、元组、集合、字典以及其他可迭代对象,对字典使用时,默认是对字典“键”进行操作,Python解释器将自动进行解包。对“键:值” 对进行操作使用字典的items()方法,对“值”进行操作应使用 values() 方法进行指定。

>>> s = {'a':1,'b':2}
>>> a,b = s
>>> a
'a'
>>> a,b = s.items()
>>> b
('b', 2)
>>> a,b = s.values()
>>> a
1
>>> a,b,c='ABC'
>>> a
'A'

特殊用法:

>>> print(*[1,2,3],4,*(5,6))
1 2 3 4 5 6
>>> *range(3),3
(0, 1, 2, 3)
>>> {*range(3),3,4}
{0, 1, 2, 3, 4}
>>> {'a':1,**{'b':2}}
{'a': 1, 'b': 2}

序列解包逆运算

>>> a, *b, c = 1,2,3,4,5
>>> a,b,c
(1, [2, 3, 4], 5)
>>> a,*b,c=tuple(range(20))
>>> b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

传递参数是的序列解包

>>> def demo(a,b,c):
...     print(a,b,c)
...
>>> seq = [1,2,3]
>>> demo(*seq)
1 2 3
>>> seq = {1:'a',2:'b',3:'c'}
>>> demo(*seq)
1 2 3
>>> demo(*seq.values())
a b c

如果实参是字典 可以使用两个星号 ** 进行解包,会把字典转换成类似于关键字参数的形式进行参数传递。要求实参字典中的所有键都必须是函数的形参名称,或者于函数中两个星号的可变长度参数相对应。

>>> p = {'a':1,'b':2,'c':3}
>>> def f(a,b,c=5):
...     print(a,b,c)
...
>>> f(**p)
1 2 3
>>> def demo(**p):
...     for item in p.items():
...             print(item)
...
>>> demo(**p)
('a', 1)
('b', 2)
('c', 3)

一个函数需要以多种新式来接收参数,定义时一般把位置参数放在最前面,然后是默认值参数,接下来是一个星号的可变长度参数,最后两个星号的可变长度参数;调用函数是,一般也按照这个顺序进行参数传递。调用函数时如果对实参使用一个星号* 进行序列解包,那么这些解包后的实参将会被当做普通位置参数对待,并且会在关键参数和使用两个星号** 进行解包的参数之前进行处理。