例如,*
以下代码中 (asterisk) 的作用是:
print(*min(p for p in counter.items() if p[1] == max_count))
print(*team, *coef)
seasons = [datetime(*args) for args in [
(Y, 1, 1), # winter
(Y, 3, 1), # spring
(Y, 6, 1), # summer
(Y, 9, 1), # autumn
(Y, 12, 1) # winter
]]
def lcm(*args):
"""Least common multiple."""
return reduce(lambda a, b: a * b // gcd(a, b), args)
async def watchdog(loop, last_activity_time, timeout, func, *args):
"Run *func(*args)* if more than *timeout* seconds since *last_activity_time*."
while (loop.time() - last_activity_time()) < timeout:
await asyncio.sleep(1)
return func(*args)
两个**
星号的作用是什么:
'{a:.{n}f}'.format(**vars())
class A:
def __init__(self, a, **kwargs):
super().__init__(**kwargs)
Python 中的星号,除了乘法
x*y
(help('*')
) 和求幂x**y
(help('**')
) †之外 ,还用于表示零个或多个。例如在函数参数的描述中:
*
意味着该函数采用零个或多个参数,这些参数在函数内部作为元组可用args
:两个星号用于命名参数:
这里
g()
需要两个必需的参数和任意(零个或多个)数量的其他参数:kwargs
是按名称传递的可选参数的字典(c
在本例中)。这args
是一个空元组()
,因为没有传递额外的位置参数。毕竟
*
所有参数都必须按名称传递, 例如:调用时,如果给定,则
key
必须按名称指定:min([1,2,-3], key=abs)
。接受任意数量的参数在创建包装函数时很有用:
通过多重继承
**kwargs
,它有助于实现基类方法的参数兼容性要求,因为它kwargs
允许您传递任意命名参数。可见调用函数时也可以使用星号:
任意集合(通常是可迭代的)
L
被s
解包,每个元素作为单独的参数传递给被调用函数(print()
)。也可以与显式赋值一起使用:
在这种情况下,列表中的第一个和最后一个参数
L
被解压缩为显式名称 (first
,last
),而列表中的零个或多个元素的其余部分被放置在 中middle
。当使用适当的语法(元组、列表、集合和字典显示)在源代码中指定列表、元组、集合和字典时,也可以使用星号:
一个微妙的地方:Python 中的逗号创建一个元组——只有空元组才需要括号
()
。因此,第一行等同于:(*range(4), 4)
。与函数调用一样,星号在这里解压缩集合,就像每个元素都单独传递给适当的构造函数一样。
这样你就可以添加两个字典或任意映射(Mapping):
在存在重复键的情况下,后面的值会像往常一样胜出:
{'a': 1, 'a': 3} == {'a': 3}
。了解星号的作用有助于解释如何
zip(*matrix)
转置方阵,或如何一次精确地迭代迭代器n
中的元素:zip(*[iterator]*n)
。除了指定的值外,文件名中还可以使用星号来创建模板(通配符),例如:
第一个
print()
打印当前目录中的所有(零个或多个)文件名,以空格分隔,后缀为.py
. 这种 (*.py
) 语法很流行,因为它在命令行 (shell) 上使用。第二个
print()
有两个星号 ('**/*.py'
) 显示整个目录树(包括子目录)中的 Python 文件的名称。在正则表达式中,
*
表示重复零次或多次:†自然数的乘法
n*m
可以被认为是重复加法(零次或多次)。同样,求幂n**m
可以被认为是重复乘法: