Python * ** 打包解包 详解

本文深入讲解Python中的*和**操作符的应用,包括如何在函数调用、生成器表达式及显示输出中使用解包操作。此外,还介绍了通过*args和**kwargs进行参数传递的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

里边出现的英文都来自于python官网的开发者指南1

本文主要就是介绍***对此展开详细介绍。


Unpacking is proposed to be allowed inside tuple, list, set, and dictionary displays.

解包操作可以应用于元组、列表、集合、字典。

  • *args:用于列表、元组、集合
  • **kwargs:用于字典

首先先回顾一下range,以及用range生成元组、列表和集合。

li = list(range(7))
print(li)
tu = tuple(range(7))
print(tu)
se = set(range(7))
print(se)

[0, 1, 2, 3, 4, 5, 6]
(0, 1, 2, 3, 4, 5, 6)
{0, 1, 2, 3, 4, 5, 6}

可用位置

***可以用于任意位置的解包。

Specifically, in function calls, in comprehensions and generator expressions, and in displays.

Display

所谓的用于显示我觉得就是直接用于解包,(总不可能是直接输出😶)

li = list(range(7))
tu = tuple(range(7))
se = set(range(7))

print(*li,*tu,*se)

0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6

上边是*直接完成了列表、元组和集合的解包。

但是不能用**对字典解包,print(**{"name":"sian","name":25})会报错SyntaxError: invalid syntax

虽然不能用于直接输出,但是可以切片。

dic = {"name":"sian","name2":"sian"}
a = {'a':0,**dic,'c':1}

print(a)

{‘a’: 0, ‘name’: ‘sian’, ‘name2’: ‘sian’, ‘c’: 1}

**都可以切片了,那*也可以:

li = [1,2,3]
a = [1,*li,0]

print(a)

[1, 1, 2, 3, 0]

Comprehensions and generator expressions

生成器推导式就是:

print(i for i in range(7))

<generator object at 0x000002502D43A510>

输出告诉你这是一个生成器对象。

可以用生成器对象创建列表和集合,但是直接无法创建元组。

li = [i for i in range(7)]
se = {i for i in range(7)}
print(li,se)

[0, 1, 2, 3, 4, 5, 6] {0, 1, 2, 3, 4, 5, 6}

*解包生成器对象就是:

print(*[i for i in range(7)])

0 1 2 3 4 5 6

直接连变量名都省了👏。

**也不能用于这里的解包。

Function call

用于函数调用就很常见了。

def function(num,*args):
    print(num)
    print(args)
    print(*args)
    
function(1,2,3,4,5,6,7)
function('a',1,2,3,'b')

1
(2, 3, 4, 5, 6, 7)
2 3 4 5 6 7
a
(1, 2, 3, ‘b’)
1 2 3 b

*args用于接收任意长度的参数并将其打包存储在元组中。

但是位置不够灵活,它会接收从*args开始位置到最后的所有参数。

  • 比如def function(first,*args,last):,last会接收不到参数,报错function() missing 1 required keyword-only argument: 'last'

    但是你可以手动指定参数来解决这个问题。比如这样强行给last一个值。

    def function(first,*args,last="c"):
        print("first:",first)
        print(args)
        print("last:",last)
        
    function(1,2,3,4,5,6,7)
    

    first: 1
    (2, 3, 4, 5, 6, 7)
    last: c

  • *args之前的参数无法手动指定。

    def function(first='a',*args):
        print("first:",first)
        print(args)
        
    function(1,2,3,4,5,6,7)
    

    first: 1
    (2, 3, 4, 5, 6, 7)

再看一下**接收参数将其打包为字典。

def function(first='a',**kwargs):
    print("first:",first)
    print(kwargs)
    
function(1,name = "Sian", age = 25,b=2)

first: 1
{‘name’: ‘Sian’, ‘age’: 25, ‘b’: 2}

留个坑。在函数调用中限制参数传入顺序。但是没时间写了。以后有空填坑。


  1. PEP 448 – Additional Unpacking Generalizations | Python.org ↩︎

  2. PEP 289 – Generator Expressions | Python.org ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ann's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值