1、问题描述
  当我们在使用python进行编码时,发现里面有单星号或者双星号,总是分不清楚他们的区别,这也导致不知道我们如何去使用它。下面,我将介绍单星号或者双星号的使用情况。
2、单星号使用情况
(1)元组解包
  在对一个元组进行解包时,变量的数量必须和元组中的元素的数量一致;也可以在变量前边添加一个星号,这样变量将会获取元组中所有剩余的元素。
代码如下:

my_tuple = 10, 20, 30, 40
a, b, *c = my_tuple
# 输出:10 20 [30, 40]
print(a, b, c)

(2)用于不定长参数传参
  在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到所有的实参。
  比如:*nums会接受所有的位置实参,并且会将这些实参统一保存到一个元组中(装包)。代码如下:

# 参数以元组(tuple)的形式导入
def sum1(*nums):
    # 定义一个变量,来保存结果
    result = 0
    # 遍历元组,并将元组中的数进行累加
    for n in nums:
        result += n
    print(result)

# 执行,输出:6
sum(1,2,3)
  • 1、带星号的形参只能有一个,可以和其他参数配合使用。
# 第一个参数给a,第二个参数给b,剩下的都保存到c的元组中
def fn1(a, b, *c):
    print('a =', a)
    print('b =', b)
    print('c =', c)

# 执行
#输出结果如下:参数c包含两个数据3,4。
	#a = 1
	#b = 2
	#c = (3, 4)
"""
fn1(1, 2, 3, 4)
  • 2、可变参数不是必须写在最后,但是注意,带*的参数后的所有参数,必须以关键字参数的形式传递。
# 第一个参数给a,剩下的位置参数给b的元组,c必须使用关键字参数。
def fn2(a, *b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)

# 执行,参数c以关键字参数传递。
"""
输出结果如下:
a = 1
b = (2, 3)
c = 4
"""
fn2(1, 2, 3, c=4)

3、双星号使用情况
双星号(**):**kwargs表示将参数以字典的形式导入。
(1)接收其他的关键字参数,它会将这些参数统一保存到一个字典中。
  字典的key就是参数的名字,字典的value就是参数的值。

def fn3(a, b, **c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


"""
输出:
a = 1
b = 2 
c = {'c': 3, 'd': 4} # 是一个字典类型的数据
"""
fn3(a=1, b=2, c=3, d=4)
"""
输出:
a = 1
b = 2
c = {'c': 3, 'd': 4}
"""
fn3(1, 2, c=3, d=4)

(2)对字典进行一个解包

def fn4(a, b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)

# 创建一个字典
d = {'a': 100, 'b': 200, 'c': 300}
"""
输出:
a = 100
b = 200
c = 300
"""
fn4(**d)

(3)这两个用法可以同时出现在一个函数中

"""
输出:
1
2
(3, 4)
{'e': 5, 'f': 6, 'g': 7}
"""
def foo(a, b=10, *args, **kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)


foo(1, 2, 3, 4, e=5, f=6, g=7)
  • **形参只能有一个,并且必须写在所有参数的最后。