如何解决为什么我们使用 ** 在 python 中解包
根据我的经验,拆包**没用
所以请阅读我的问题并告诉我为什么我们使用它们或者给我一个例子说明两个星号是有用的
为什么我们在 python 函数中使用 ** 进行解包,而我们可以在没有它们的情况下获得相同的结果。
所以,
dict1 = {"brand": "Ford","model": "Mustang","year": 1964}
def func(args):
for i in args.items():
print(i)
func(dict1)
前面的函数会得到和下面一样的结果
dict1 = {"brand": "Ford","year": 1964}
def func(**args):
for i in args.items():
print(i)
func(**dict1)
解决方法
这在您的函数中不是问题,因为您正在显式迭代传递的字典,但在一般情况下,*
用于解包 args
,**
用于解包 { {1}} / 关键字参数。
这可以从下面的结果中看出 -
- 使用 ** 解包关键字参数将每个键映射到相应的关键字参数。这将返回函数中定义的相应参数的值。
kwargs
- 单个 * 仅将字典解压缩到其键。因此,当这些被传递时,该函数将键作为字符串返回。在这种情况下,传递参数的正确数据结构是列表或元组。
def func(brand,model,year):
return brand,year
dict1 = {"brand": "Ford","model": "Mustang","year": 1964}
print(func(**dict1))
#OUTPUT: ('Ford','Mustang',1964)
- 如果没有解包,这个场景就会失败,因为模型需要 3 个参数,但只有 1 个(字典)。
dict1 = {"brand": "Ford","year": 1964}
print(func(*dict1))
#OUTPUT: ('brand','model','year')
,
您通常不会在不需要与其他任何东西集成的函数的 API 中包含 **args
。您通常会使用它以某种不关心确切参数行为的方式包装/与另一个函数交互。例如,考虑以下人为的例子:
@memoize
def f(a=0,b=0):
if a==0: return b
return a * f(a-1,b-a)
def memoize(f):
cache = {}
def _f(**kwargs):
t = tuple(kwargs.items())
if t not in cache:
cache[t] = f(**kwargs)
return cache[t]
return _f
使用 **kwargs
而不是传入字典的主要优点是记忆化的函数与它包装的函数具有完全相同的 API,因此调用者无法合理地区分它们。
正如您所指出的,从实现的角度来看,这两种约定在功能上没有太大区别——区别在于您向外界公开的 API(性能也会有所不同,但就我而言担心与其他提高性能的方法相比,我认为不值得关注如此小的收益)。在某些地方,这可能根本无关紧要,而在其他地方,您可能有充分的理由选择一种策略而不是另一种。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。