Python3-星号和双星号变量用法

在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法 “在变量前添加单个星号或两个星号”,实现多参数的传入或变量的拆解。

* 该位置接受任意多个非关键字(non-keyword)参数,在函数中将其转化为元组(1,2,3,4)

** 该位置接受任意多个关键字(keyword)参数,在函数 ** 位置上转化为字典 [key:value, key:value]

单星号变量

注意:单星号是无法读取到字典中的值的,只会读取到字典中的键(key),如果想读取到字典中的值,需要使用双星号(**)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def one(*x):
print(x)
print(x[0])

lst=["a","b","c","d"]
stri="python * char"

# 在函数中将其转化为元组
one(stri,lst)
# outputs :
# ('python * char', ['a', 'b', 'c', 'd'])
# python * char


# 在函数的参数传递中,对一个普通变量使用单星号前缀,
# 会将这个变量拆分成单个元素
one(*lst)
# outputs :
# ('a', 'b', 'c', 'd')
# a

one(*stri)
# outputs:
# ('p', 'y', 't', 'h', 'o', 'n', ' ', '*', ' ', 'c', 'h', 'a', 'r')
# p

双星号变量

双星号会将字典首先转换成关键字参数的形式,相当于使用字典中的键作为变量名,如果键不符合变量命名规则,则会抛出一个 TypeError 异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def one(**x):
print(x)
b=()
for a in x.values():
b+=(a,)
print(b)

dect={"one":1,"two":2,"three":3}
one(**dect)
# outputs :
# {'one': 1, 'two': 2, 'three': 3}
# (1, 2, 3)

# 对一个字典使用双星号前缀,就相当于将其拆分成关键字参数的形式,
# **dect 等价于:
# 即:双星号将接收到的所有关键字参数都保存成一个字典
one(one=1,two=2,three=3)
# outputs :
# {'one': 1, 'two': 2, 'three': 3}
# (1, 2, 3)

星号在非关键字参数(位置参数)和关键字参数的作用

同时出现”非关键字参数(位置参数)”和”关键字参数”时,使用一个单星号来分隔这两种参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def mix(a,b,*,x,y):
"""位置参数与关键字参数混合"""
return a,b,x,y

def mix1(a,b,*c,x,y):
"""位置参数与关键字参数混合"""
return a,b,c,x,y

# 星号前面的a和b是位置参数,星号后面的x和y是关键字参数
# 关键字参数一定要使用"变量名=值"的形式传入数据
print(mix(1,2,x=3,y=4))
# outputs:
# (1, 2, 3, 4)

# 如果位置参数与关键字参数之间已经存在一个单星号位置参数,
# 那么这个参数后面的就都是关键字参数,不需要再使用星号来分隔
print(mix1(1,2,3,4,5,x=6,y=7))
# outputs :
# (1, 2, (3, 4, 5), 6, 7)

函数中包含多种参数的组合,必须遵守这样的顺序:位置参数(必选参数),默认参数,单星号参数或星号分隔符,关键字参数,双星号参数。

1
2
3
4
5
6
7
def mix(a,b=0,*c,x,**y):
"""位置参数与关键字参数混合"""
return a,b,c,x,y

print(mix(1,2,3,4,5,x=6,y=7,z=8))
# outputs:
# (1, 2, (3, 4, 5), 6, {'y': 7, 'z': 8})

参考:

[Python]-12-星号变量的特殊用法