RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 594651
Accepted
jfs
jfs
Asked:2020-11-23 05:07:40 +0000 UTC2020-11-23 05:07:40 +0000 UTC 2020-11-23 05:07:40 +0000 UTC

*(星号)和 ** 双星号在 Python 中是什么意思?

  • 772

例如,*以下代码中 (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
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    jfs
    2020-11-23T05:07:40Z2020-11-23T05:07:40Z

    Python 中的星号,除了乘法x*y( help('*')) 和求幂x**y ( help('**')) †之外 ,还用于表示零个或多个。

    例如在函数参数的描述中:

    def f(*args):
        print(args)
    

    *意味着该函数采用零个或多个参数,这些参数在函数内部作为元组可用args:

    >>> f(1,'a')
    (1, 'a')
    

    两个星号用于命名参数:

    def g(a, b, *args, name='default', **kwargs):
        print(a, b, args, name, kwargs)
    

    这里g()需要两个必需的参数和任意(零个或多个)数量的其他参数:

    >>> g(1, b=2, c=3)
    1 2 () default {'c': 3}
    

    kwargs是按名称传递的可选参数的字典(c在本例中)。这 args是一个空元组(),因为没有传递额外的位置参数。

    毕竟*所有参数都必须按名称传递, 例如:

    def min_item(items, *, key=lambda x: x):
        ...
    

    调用时,如果给定,则key必须按名称指定: min([1,2,-3], key=abs)。

    接受任意数量的参数在创建包装函数时很有用:

    def my_print(*args, **kwargs):
        flush = kwargs.pop('flush', True) # flush unless overriden
        print(*args, flush=flush, **kwargs)
    

    通过多重继承 **kwargs,它有助于实现基类方法的参数兼容性要求,因为它kwargs允许您传递任意命名参数。

    可见调用函数时也可以使用星号:

    L = [1, 2, 3]
    s = "abc"
    print(*L, *s) # iterable unpacking: print(1, 2, 3, 'a', 'b', 'c')
    # -> 1 2 3 a b c
    

    任意集合(通常是可迭代的)L被s解包,每个元素作为单独的参数传递给被调用函数(print())。

    也可以与显式赋值一起使用:

    >>> first, *middle, last = L
    >>> first, middle, last
    (1, [2], 3)
    

    在这种情况下,列表中的第一个和最后一个参数L被解压缩为显式名称 ( first, last),而列表中的零个或多个元素的其余部分被放置在 中middle。

    当使用适当的语法(元组、列表、集合和字典显示)在源代码中指定列表、元组、集合和字典时,也可以使用星号:

    >>> *range(4), 4
    (0, 1, 2, 3, 4)
    >>> [*range(4), 4]
    [0, 1, 2, 3, 4]
    >>> {*range(4), 4}
    {0, 1, 2, 3, 4}
    >>> {'x': 1, **{'y': 2}} # dictionary unpacking inside dictionary display
    {'x': 1, 'y': 2}
    

    一个微妙的地方:Python 中的逗号创建一个元组——只有空元组才需要括号()。因此,第一行等同于:(*range(4), 4)。

    与函数调用一样,星号在这里解压缩集合,就像每个元素都单独传递给适当的构造函数一样。

    这样你就可以添加两个字典或任意映射(Mapping):

    >>> a = {'a': 1, 'b': 2}
    >>> b = {'a': 3, 'c': 0}
    >>> {**a, **b}
    {'a': 3, 'b': 2, 'c': 0}
    >>> {**b, **a}
    {'a': 1, 'c': 0, 'b': 2}
    

    在存在重复键的情况下,后面的值会像往常一样胜出:{'a': 1, 'a': 3} == {'a': 3}。

    了解星号的作用有助于解释如何zip(*matrix)转置方阵,或如何一次精确地迭代迭代器n中的元素:zip(*[iterator]*n)。

    除了指定的值外,文件名中还可以使用星号来创建模板(通配符),例如:

    from pathlib import Path
    
    print(*Path().glob('*.py'))
    print(*Path().glob('**/*.py'))
    

    第一个print()打印当前目录中的所有(零个或多个)文件名,以空格分隔,后缀为.py. 这种 ( *.py) 语法很流行,因为它在命令行 (shell) 上使用。
    第二个print()有两个星号 ( '**/*.py') 显示整个目录树(包括子目录)中的 Python 文件的名称。

    在正则表达式中, *表示重复零次或多次:

    import re
    
    if re.fullmatch(r'x*', text):
        print('текст пустой или содержит только `x`')
    

    †自然数的乘法n*m可以被认为是重复加法(零次或多次)。同样,求幂n**m可以被认为是重复乘法:

     2  * 3 ==  2 + 2 + 2
     2 ** 3 ==  2 * 2 * 2
    [2] * 3 == [2,  2,  2] 
    

    • 83

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5