我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

python编程语言,在函数定义的时候,形参前面有个(双)星号。在函数调用的时候,实参前面也有个(双)星号。这就涉及到了一个传参解压功能,也就是本文所主要描述的问题。本文主要描述单星号解压list/tuple类型数据。

苏南大叔:python代码,如何利用单星号解压list/tuple类型数据? - 单星号解压list-tuple类型
python代码,如何利用单星号解压list/tuple类型数据?(图4-1)

大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔的代码经验文章。本文描述python语言环境中,单星号实现的参数解压功能。测试环境:win10python@3.11.0

前文回顾

关于python里面的两个星号的问题,苏南大叔总结过两篇文章了。本文是第三篇关于单星号的用法的文章总结:

涉及到多个数据类型的总结:

单星号解压tuplelist

普通的解压功能,参考范例:

tuple1 = ("苏","南")
tuple2 = ("大","叔")

tuple3 = tuple1 + tuple2             # ('苏', '南', '大', '叔')
tuple4 = (*tuple1, *tuple2)          # ('苏', '南', '大', '叔')
tuple5 = tuple(zip(tuple1, tuple2))  # (('苏', '大'), ('南', '叔'))
tuple6 = (*tuple5[0], *tuple5[1])    # ('苏', '大', '南', '叔')
su, nan, *dashu = tuple3             # 苏 南 ('大', '叔')
print(tuple3,type(tuple3))           # ('苏', '南', '大', '叔') <class 'tuple'>
print(tuple4)                        # ('苏', '南', '大', '叔')
print(tuple5)                        # (('苏', '大'), ('南', '叔'))
print(tuple6)                        # ('苏', '大', '南', '叔')
print(su,nan,dashu,type(dashu))      # 苏 南 ('大', '叔') <class 'list'>
最后一条中,tuple类型居然解压出了一个list类型...

苏南大叔:python代码,如何利用单星号解压list/tuple类型数据? - 普通解压
python代码,如何利用单星号解压list/tuple类型数据?(图4-2)

上述代码中的tuple类型,直接修改为list类型,依然成立。

list1 = ["苏","南"]
list2 = ["大","叔"]

list3 = list1 + list2             # ['苏', '南', '大', '叔']
list4 = [*list1, *list2]          # ['苏', '南', '大', '叔']
list5 = list(zip(list1, list2))   # [('苏', '大'), ('南', '叔')]
list6 = [*list5[0], *list5[1]]    # ['苏', '大', '南', '叔']
su, nan, *dashu = list3           # 苏 南 ['大', '叔'] <class 'list'>
print(list3,type(list3))          # ['苏', '南', '大', '叔'] <class 'list'>
print(list4)                      # ['苏', '南', '大', '叔']
print(list5)                      # [('苏', '大'), ('南', '叔')]
print(list6)                      # ['苏', '大', '南', '叔']
print(su,nan,dashu,type(dashu))   # 苏 南 ['大', '叔'] <class 'list'>

单星号传参解压tuplelist

单星号的传参解压功能,参考范例:

tuple1 = ("苏", "南")
def test(tuple1, s, *s1):
    print( (tuple1, ("大", "叔")) )    # (('苏', '南'), ('大', '叔'))
    print( (*tuple1, *("大", "叔")) )  # ('苏', '南', '大', '叔')
    print(sum(s))   # 6
    print(sum(s1))  # 6
test(tuple1, (1, 2, 3), *(1, 2, 3))

换成list类型,依然成立。

list1 = ["苏", "南"]
def test(list1, s, *s1):
    print( (list1, ["大", "叔"]) )    # (('苏', '南'), ('大', '叔'))
    print( (*list1, *["大", "叔"]) )  # ('苏', '南', '大', '叔')
    print(sum(s))   # 6
    print(sum(s1))  # 6
test(list1, [1, 2, 3], *[1, 2, 3])

苏南大叔:python代码,如何利用单星号解压list/tuple类型数据? - 传参解压2
python代码,如何利用单星号解压list/tuple类型数据?(图4-3)

另外一个可能的答案

整体上来说,目前来看,这个单星号在函数定义的时候,似乎没有啥意义。其正确的用法可能是这样的:

list1 = ["苏", "南"]
def test(list1, s, *s1):
    print((list1, ["大", "叔"]))    # (('苏', '南'), ('大', '叔'))
    print((*list1, *["大", "叔"]))  # ('苏', '南', '大', '叔')
    print(sum(s))   # 6
    print(sum(s1))  # 6
test(list1, [1, 2, 3], 1, 2, 3)

但是这种使用方式下,单星号可不是一个解压的功能了,它把剩余参数合并成了一个tuple

苏南大叔:python代码,如何利用单星号解压list/tuple类型数据? - 可能正确的答案
python代码,如何利用单星号解压list/tuple类型数据?(图4-4)

def who(su, nan, *dashu):
    print(su)                   # 苏
    print(nan)                  # 南
    print(dashu,type(dashu))    # ('大', '叔') <class 'tuple'>

me = ['苏', '南', '大', '叔']
who(*me)

只能定义一个单星号

另外,根据python函数定义的规则,加星号的参数有且只有一个。

def test3(*tuple1,*tuple2):

如果试图如上定义,会得到报错信息:

bashSyntaxError: * argument may appear only once

结束语

没有啥可说的,链接见下面:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python