python中**的作用,双星号和单星号


在Python中,碰到表达式前面加上*或者加上**, 就是所谓的星号表达式(starred expression)

单星号*,用于展开可迭代的数据,
双星号 **,用于展开字典。

单星号 * 的含义

单个的星号*操作,表示展开一个可迭代的数据。哪些数据是可迭代的呢?常见的如列表,元组, 字符串等。

a, b, c = '123'
print(a, b, c)
d, e, f = ['Ann', 30,'Monky']
print(d, e, f)
1 2 3
Ann 30 Monky

上面的例子中,可迭代数据中的元素可以是字符串‘123’或者列表,其中元素都只有三个。左边用来展开可迭代数据的变量个数也有三个。一个匹配一个即可。但是左边用来匹配的只有两个,可以怎么做呢?

a, *b = '123'
print(a, b)
d, *rest = ['Ann', 30,'Monky']
print(d,rest)
1 ['2', '3']
Ann [30, 'Monky']

通过借助*星号,可以成功的将后续匹配出来,形成列表。

a, *b, c = '12345'
print(a, b,c)
1 ['2', '3', '4'] 5

从这些例子可以看出来,利用星号表达式,可以匹配任意长度的可迭代数据。

单个星号在函数输入参数时的作用

调用函数时候,作为函数的参数来输入,可以将所有输入参数组合在一起,再一起放到函数中。比如下面的add函数有两个输入参数,可以通过用inputs=[1,2]将两个值放在一起,并且*展开inputs作为输入,来调用add,实现函数调用。

def add(x, y):
    print("add output:",x+y)

input = [4, 5]
add(*input)
add output: 9

注意,上面的input前需要加*,如果不加则报错:
在这里插入图片描述
错误提示是输入的参数个数不对,只有一个用来匹配了x,缺少一个用来匹配y的。但是利用*来将[1,2]列表展开后,就有了两个元素,可以作为add函数的两个输入参数,符合函数的参数个数要求,就不会有错误了。

* 在函数定义时的参数定义中的作用

在函数定义时候使用*args(args也可以是别的名字)作为输入参数,表示可以用来匹配任意个数(或者可变长度参数)的输入输入参数。

def func1(*args):
    print(*args)

def func2(*args):
    print(args)   # 以元组形式输出


func1(1,2,3,'abc')
func2(1, 2, 'abc')

1 2 3 abc
(1, 2, 'abc')

可以看到,args匹配到了所有的输入参数值,按输入值的顺序,组成了一个列表。因此*args,可以完成函数的位置参数(positional argument)的匹配。

双星号**的含义

**用来展开字典。可以用来合并字典,比如dic1和dic2想要合并为一个大字典dic3,可以用dic3 = {**dic1, **dic2}来完成;如果用dic3 = {dic1, dic2}则会报错。
在这里插入图片描述

**用在函数输入参数时的作用

同样在函数调用时,使用**来实现关键字参数的输入例子。

def func1(x, y):
    print("func1--output:",x, y)
func1(2,3)
kwargs={
    
    'x':1, 'y':2}
func1(**kwargs)

# 在func1函数调用时候,使用**将kwargs展开,变成了需要的关键字参数,func1(**kwarg)相当于调用func1(x=1,y=2)。
# 注意,这里的kwargs的key要和func1接收的参数名称要一致!!!
func1--output: 2 3
func1--output: 1 2

**在函数定义时的参数定义中的作用

如果在函数定义时,做为输入,可以用来匹配关键字参数,并且在调用时候,将关键字参数的关键字和输入值,组成字典。

def func(**kwargs):
    print(kwargs)

func(x=1, y=2)

可以看到,kwargs将输入的关键字参数均组成了到了一个字典里面。

{
    
    'x': 1, 'y': 2}

思考题:

  1. 在这里插入图片描述
def func(*args, **kwargs):
    print(args, kwargs)

func(1, 2, 3, x=1, y=2)  
# (1, 2, 3) {'x': 1, 'y': 2}
func(1, 2, 3, x=1, y=2, 4) # SyntaxError: positional argument follows keyword argument

参考博客

猜你喜欢

转载自blog.csdn.net/weixin_43845922/article/details/129910868