星号 (*
) 可用于 Python 中的不同情况:
- 乘法和幂运算
- 创建具有重复元素的列表、元组或字符串
*args
,**kwargs
和关键字参数- 为函数参数解包列表/元组/字典
- 拆包容器
- 将容器合并到列表/合并字典
乘法和幂运算
代码:
print(7 * 5)
print(2**4)
结果:
35
16
创建具有重复元素的列表、元组或字符串
代码:
# 列表
zeros = [0] * 10
onetwos = [1, 2] * 5
print(zeros)
print(onetwos)
# 元组
zeros = (0,) * 10
onetwos = (1, 2) * 5
print(zeros)
print(onetwos)
# 字符串
A_string = "A" * 10
AB_string = "AB" * 5
print(A_string)
print(AB_string)
结果:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
(1, 2, 1, 2, 1, 2, 1, 2, 1, 2)
AAAAAAAAAA
ABABABABAB
*args
, **kwargs
和关键字参数
- 将
*args
用于可变长度参数 - 将
**kwargs
用于可变长度的关键字参数 - 使用
*
后跟更多函数参数来强制仅使用关键字参数
代码:
#可变参数
def my_function(*args, **kwargs):
for arg in args:
print(arg)
for key in kwargs:
print(key, kwargs[key])
my_function("Hey", 3, [0, 1, 2], name="Alex", age=8)
#强制关键词参数
def my_function2(name, *, age):
print(name)
print(age)
my_function2("Michael", age=5)
结果:
Hey
3
[0, 1, 2]
name Alex
age 8
Michael
5
参数解包
- 如果长度与参数匹配,则列表/元组/集合/字符串可以使用一个
*
解压缩为函数参数。 - 如果长度和键与参数匹配,字典可以用两个
**
解包。
代码:
def foo(a, b, c):
print(a, b, c)
my_list = [1, 2, 3]
foo(*my_list) # *list传参
my_string = "ABC"
foo(*my_string)
my_dict = {'a': 4, 'b': 5, 'c': 6}
foo(**my_dict) # **dict传参
结果:
1 2 3
A B C
4 5 6
拆分容器
将列表、元组或集合的元素解包为单个和多个剩余元素。
代码:
numbers = (1, 2, 3, 4, 5, 6, 7, 8)
print("*在开始:")
*beginning, last = numbers
print(beginning, last)
print("*在末尾:")
first, *end = numbers
print(first, end)
print("*在中间位置:")
first, *middle, last = numbers
print(first, middle, last)
结果:
*在开始:
[1, 2, 3, 4, 5, 6, 7] 8
*在末尾:
1 [2, 3, 4, 5, 6, 7, 8]
*在中间位置:
1 [2, 3, 4, 5, 6, 7] 8
将迭代元素合并到列表/字典
代码:
# 合并列表
my_tuple = (1, 2, 3)
my_set = {4, 5, 6}
my_list = [*my_tuple, *my_set]
print(my_list)
# 合并字典
dict_a = {"one": 1, "two": 2}
dict_b = {"three": 3, "four": 4}
dict_c = {**dict_a, **dict_b}
print(dict_c)
结果:
[1, 2, 3, 4, 5, 6]
{'one': 1, 'two': 2, 'three': 3, 'four': 4}