【python学习】*和**:python中的解包符、收集参数


前言

最近学习python中的函数的收集参数时,遇到了两个特殊的参数符号:*和**
下面简单讨论下这两个符号的用法。


一、用法一:解包(Unpacking)

1.*对容器类型list、tuple、dict、set解包

简单来说就是*可以把上面三种数据类型中的每个元素都
扒掉外衣(有点粗鲁,但实际就是这样)

让我们来看下扒掉的效果:

>>> list1 = [1,2,3]
>>> print(*list1)
1 2 3

扒掉外衣接下来我们可以对它进行一些封装的操作,把它们封装成其他数据类型,像是dict、list,我们来试试:

list1 = [1,2,3]
tup1 = (1,2,3)
set1 = {1,2,3}
dict1 = {'name':'Mogu134','age':19}

print([*list1]) # [1, 2, 3]
print({*list1}) # {1, 2, 3}
print(*tup1) # 1 2 3
print({*tup1}) # {1, 2, 3}
print([*set1]) # [1, 2, 3]
print(*dict1) # name age

2.**对容器dict解包

同样的,我们来看对dict解包会发生什么:

>>> print(**dict1)
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    print(**dict1)
TypeError: 'name' is an invalid keyword argument for print()

这是个错误演示,因为print()函数没有关键字参数name、age所以报错,但是它返回的值实际上是这样的:

name = 'Mogu134',age = 19

那字典解包该怎么用呢,下面通过两个小栗子来说明:

# 案例一 解包的元素作为参数传给定义的函数
>>> def myfun(name,age):
	print(name,age)
>>> myfun(**dict1)
Mogu134 19

# 案例二 解包两个字典合为一个字典
>>> dict2 = {'nationality':'China','hobby':'eating'}
>>> print({**dict1,**dict2})
{'name': 'Mogu134', 'age': 19, 'nationality': 'China', 'hobby': 'eating'}

二、用法二:收集参数

1.*收集元组

*args收集参数接受任意数量的位置实参,并把所有收集到的实参存入args元组中:

>>> def test(*args):
	print(args)	
>>> test('晚上','操场','团建','班导','星空','草地','路灯','快速路','飞机')
('晚上', '操场', '团建', '班导', '星空', '草地', '路灯', '快速路', '飞机')

2.**收集字典

**kwargs收集参数接受任意数量的关键字实参,并把所有收集到的实参存入kwargs字典中:

>>> def test(**kwargs):
	print(kwargs)	
>>> test(time='晚上',place='操场',activity='团建')
{'time': '晚上', 'place': '操场', 'activity': '团建'}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了*和**的两种用法:给某些容器类型解包和用作收集参数,而python的解包符提供了更多功能和操作,更多用法等待大家探索~~

### Python 解包操作的使用方法 #### 单星号 `*` 的功能 单星号 `*` 主要用于处理不定数量的位置参数。当定义函数时,可以利用 `*args` 来接收任意多的位置参数,并将其作为元组形式存储。 ```python def example_function(a, b, *args): print(f"a={a}, b={b}") print("Additional arguments:", args) example_function(10, 20, "hello", True, None) ``` 上述代码会打印出前两个固定参数 a b 的值,接着显示剩余传入的所有额外参数组成的元组[^2]。 #### 双星号 `**` 的功能 双星号 `**` 则是用来收集关键字参数的关键字-值对组合成字典对象,在函数内部可以通过键访问对应的值。 ```python def another_example(x, y, **kwargs): print(f"x={x}, y={y}") for key, value in kwargs.items(): print(f"{key} -> {value}") another_example('foo', 'bar', color='red', size=42) ``` 这段程序展示了如何通过 `**kwargs` 接收并遍历传递给函数的关键字参数。 #### 实际应用场景中的解包 除了应用于函数声明外,这些号还可以用来简化列表、元组等可迭代对象之间的赋值过程——即所谓的“解包”。 ```python first, second, *rest = [1, 2, 3, 4, 5] print(first) # Output: 1 print(second) # Output: 2 print(rest) # Output: [3, 4, 5] # 对于已知长度的情况也可以直接指定变量名来分配各个元素 one, two, three = range(3) print(one, two, three) # Output: 0 1 2 ``` 这里展示的是将序列按照位置依次分配到不同的变量上;对于多余的部分则可以用带有星号标记的名字捕获为一个新的列表[^4]。 另外值得注意的是 zip 函数能够把多个集合配对起来形成新的复合结构: ```python names = ["Alice", "Bob"] ages = [25, 30] paired_data = list(zip(names, ages)) print(paired_data) # [(‘Alice’, 25), ('Bob', 30)] ``` 此例子说明了怎样借助内置工具实现数据间的关联映射关系[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值