python \*和**用法、序列解包

1.算数运算

* 代表乘法
** 代表乘方

2.函数形参

主要用于函数定义,区别:

  • *args,表示任何多个无名参数,它本质是一个 tuple(位置参数positional argument)
  • **kwargs 表示关键字参数,它本质上是一个 dict(关键词参数keyword argument)
    如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。可变位置参数*args是一个元组,是不可修改的。
def fun(name, *args, **kwargs):
  print(name)
  print(args)
  print(kwargs)
 
fun(1, 2, 3, 4, 5, a="1", b="2", c="3")

1
(2, 3, 4, 5)
{a="1", b="2", c="3"}
3.函数实参

如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用。

def fun(data1, data2, data3):
  print("data1: ", data1)
  print("data2: ", data2)
  print("data3: ", data3)
  
args = ("one", 2, 3)
fun(*args)

data1:  one
data2:  2
data3:  3

kwargs = {"data3": "one", "data2": 2, "data1": 3}
fun(**kwargs)

data1:  3
data2:  2
data3:  one
4.序列解包
  • 什么是序列解包,看例子:这种方法并不限于列表和元组,而是适用于任意序列类型(甚至包括字符串和字节序列)。只要赋值运算符左边的变量数目与序列中的元素数目相等,都可以用这种方法将元素序列解包到另一组变量中。
a, b, c = 1, 2, 3
# a = 1
# b = 2
# c = 3
  • 可以利用 * 表达式获取单个变量中的多个元素,只要它的解释没有歧义即可。* 获取的值默认为 list.
    获取剩余部分:
a, b, *c = 0, 1, 2, 3
# a = 0
# b = 1
# c = (2, 3)

获取中间部分:

a, *b, c = 0, 1, 2, 3
# a = 0
# b = (1, 2)
# c = 3

如果左值比右值要多,那么带 * 的变量默认为空:

a, *b, c = a, b, *c = 0, 1
# a = 0
# b = 1
# c = ()

嵌套解包:

(a, b), (c, d) = (1, 2), (3, 4)
# a = 1
# b = 2
# c = 3
# d = 4

出处:
https://blog.csdn.net/yilovexing/article/details/80577510
https://blog.csdn.net/yilovexing/article/details/80576788

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容