python中如何组包和拆包
1、组包: 通俗的讲,组包就是将多个数据装进一个包中。
在python解释器中是将多个数据,或多组数据,装进一个元组,赋值给一个变量。如:a=1,2,3 python解释器将 = 右边的数据打包成元组赋值给a。

2、可以认为组包就定义了一个元组变量,我们知道定义元组的一个重要符号就是逗号","。
所以如果把一个单独的数据赋值给变量不构成组包,例如a=3 ;它的整形,但是如果是a=3, (3后面加了逗号) 呢?看图例:

1、拆包,是将一个序列类型的数据拆开为多个数据,分别赋值给变量,位置对应。
如:a,b,c=('A','B','C'),python解释器会将其拆包为,a='A',b='B',c='C'。

2、如果序列的元素个数多于变量个数时:
①可将非第一位的变量前加星号(*);
②并且拆包的变量中只能有一个变量前可加星号(*);
③这个星号表面它后边的变量是个列表。
例如,a, *b=(1,2,3,4) 拆包后的结果是:
a=1,b=[2,3,4]
从下图例中看出,变量b,容纳了除a对应元素外的所有元素。

3、如果有更多变量,且元素多于变量:
①先将不加星号的变量按对应位置,将元素赋值给变量,
②然后把剩余的元素以列表形式赋值给带星号的变量。

4、也有元素少于变量的拆包情况, 但元素个数不能少于非带星号的变量个数,这时,带星号的变量将返回一个空的列表:
例如 a,b,*c=(1,2,),将被拆为:1,2,[ ]

5、上面的拆包例子均为元组类型,对于字符串,列表,字典等序列类型也是一样的操作。
在这个过程中,星号实际上是起到了一个组包的作用。

6、注意有关*的一个问题:
在上面例子中,在输出星号后面的变量为什么不加*呢?
那是因为,如果给变量加了星号,是另外一拆包的过程。
是这样的:
①在拆包时的那个星已经在python解释器内自动使用了,进行了组包,得到了一个列表。
②如果输出时再加个星号,python解释器自动对*后面的变量解包,是吧组包后的列表再次解包。此星号非彼星号。
例如:x=[1,2,3],
当我们输出:x的结果是[1,2,3];而输出 *x时的结果是1 2 3;

7、通过上边所述,在不知道多少个元素时,可以利用*来定义变量,
所以我们在定义函数时,如果不确定有多少个实参时,就可以使用*来定义形参;
例如:常常会看到这样的函数写法: func(*args)
