默认参数后跟可变长度参数(Python)

2024-09-29 05:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,它接受一个位置参数、一个默认参数、可变长度的非关键字参数和可变长度的关键字参数。函数如下所示:

def set_football_team(name,
                     coach = '',
                     *players, **formations):
    print("Team: "+name)
    print("Coach: "+coach)
    for i, player in enumerate(players):
        print("Player "+str(i+1)+": "+player)
    for position, positional_players in formations.items():
        positional_players = ", ".join(positional_players)
        print(position+": "+positional_players)

当所有参数都被传递时,它工作正常。你知道吗

name = "Real Madrid"
coach = "Zinedine Zidane"
players = ["Keylor Navas", "K. Casilla",
           "Sergio Ramos", "Varane", "Marcelo"]

formations = {"Goalkeeper": players[:2],
              "Defender": players[2:]}

set_football_team(name, coach, *players, **formations)

Output
==============================================
Team: Real Madrid
Coach: Zinedine  Zidane
Player 1: Keylor Navas
Player 2: K. Casilla
Player 3: Sergio Ramos
Player 4: Varane
Player 5: Marcelo
Goalkeeper: Keylor Navas, K. Casilla
Defender: Sergio Ramos, Varane, Marcelo

但是当我跳过传递coach时,即使我在参数中将coach设置为空字符串,它也会显示意外的输出:

name = "Real Madrid"
players = ["Keylor Navas", "K. Casilla",
           "Sergio Ramos", "Varane", "Marcelo"]

formations = {"Goalkeeper": players[:2],
              "Defender": players[2:]}

set_football_team(name, *players, **formations)

Output
==============================================    
Team: Real Madrid
Coach: Keylor Navas
Player 1: K. Casilla
Player 2: Sergio Ramos
Player 3: Varane
Player 4: Marcelo
Goalkeeper: Keylor Navas, K. Casilla
Defender: Sergio Ramos, Varane, Marcelo

我知道函数参数的顺序:

positional argument > default argument > variable length non keyword arguments > variable length keyword arguments

造成上述行为的原因是什么?我错过了什么?你知道吗

我如何克服这个问题?


Tags: name参数playerprintplayerscoachpositionalramos
1条回答
网友
1楼 · 发布于 2024-09-29 05:29:34
set_football_team(name, coach, *players, **formations)

如上所述调用函数时,coach作为参数传递,coach将被分配一个值,该值是在函数set\u football\u team的参数中传递的。你知道吗

set_football_team(name,*players, **formations)

在没有显式传递coach参数的情况下,如上所述调用函数时,coach主要被分配给*players的第一个值,players的剩余值被传递给players,这就是为什么您只注意到players中的4个players,而列表中的第0个元素被分配给coach。你知道吗

相关问题 更多 >