先把struct的fmt列出来:
1、struct.error: bad char in struct format:
tmp = [1,2,3,4,5]
data = struct.pack("<i"*5,*tmp)
上述代码出现该问题是因为fmt为"<i"*5,即fmt为“<i<i<i<i<i”。如果要设置byte order、size和对齐方式,则需要在字符串开始位置指定。
The optional first format char indicates byte order, size and alignment:
@: native order, size & alignment (default)
=: native order, std. size & alignment
<: little-endian, std. size & alignment
>: big-endian, std. size & alignment
!: same as >
The remaining chars indicate types of args and must match exactly;
将上述改为下述代码即可。
data = struct.pack("<"+"i"*5,*tmp)
关于*tmp的用法,主要用来传个数不定的参数,具体用法可参考python *和**的使用
*args 和 **kwargs 主要用于函数定义。
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
python函数传递参数的方式有两种:
位置参数(positional argument)
关键词参数(keyword argument)
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
*args 表示任何多个无名参数,它本质是一个 tuple
**kwargs 表示关键字参数,它本质上是一个 dict
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。