为什么参数顺序很重要?

Sar*_*rah 0 python parameters pygame

因此,我一直在自学Python,并在书中创建了Pygame(“外星人入侵”)。当我按照逐步的说明进行操作时,我意识到作者在每个函数中都有一定顺序的参数。例如,

def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, 
    aliens, bullets):
    """Respond to bullet-alien collisions."""
    # Remove any bullets and aliens that have collided.
    collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
    if collisions:
        for aliens in collisions.values():
            stats.score += ai_settings.alien_points * len(aliens)
            sb.prep_score()
Run Code Online (Sandbox Code Playgroud)

我假设此函数中的这些参数可同时工作,因此顺序并不重要,但显然确实重要。但是我如何确定哪一个先到最后呢?我如何确定哪个应该是第一个和最后一个?

Chr*_*bor 5

在大多数其他语言(例如C或C ++)中,传递参数时,它们将按顺序传递。

例如:

int my_function(string name, int size, char type)
{
    ...
}

int main()
{
    my_function("item1", 10, 'c')
}
Run Code Online (Sandbox Code Playgroud)

这就是编译器实际上是如何在实际机器代码中组织代码的方式。

在Python中,它们使程序员的工作水平更高,因此您可以执行以下操作

def my_function(name="default", size=1, type='c'):
    ...

my_function(size=4, name="item1", type=d)
Run Code Online (Sandbox Code Playgroud)

注意,如何以不同于定义函数的顺序调用带有参数的函数。

知道要为每个参数传递什么值的唯一方法是使用正确的顺序。对于python,您可以通过对调用中的参数使用赋值运算符(例如size = 2)来解决此问题。

一旦以与函数定义方式不同的顺序进行调用,则必须明确声明要为以下所有参数分配的参数。这是有道理的,因为您现在已经无序调用了该函数,并且它需要知道要引用的参数。

例如,您可以执行以下操作:

def my_function(name, size, type, id):
    ...

my_function("item1", size=4, type=d, id=3)
Run Code Online (Sandbox Code Playgroud)

但是您不能这样做:

my_function("item1", size=4, d, 3)
Run Code Online (Sandbox Code Playgroud)

因为现在不知道,如果你的意思是设定diddtype反之亦然。


您的问题是如何知道该功能需要什么样的顺序。找到此功能的最佳方法是阅读所使用功能的文档。

如果您去这里https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.groupcollide

您可以找到pygame.sprite.groupcollide,并按期望的顺序提供函数参数。您还可以在每个参数之后使用=运算符手动进行分配。

#documentation found online
pygame.sprite.groupcollide()
Find all sprites that collide between two groups.
groupcollide(group1, group2, dokill1, dokill2, collided = None)
Run Code Online (Sandbox Code Playgroud)

例如,在您的代码中,您可以调用:

  pygame.sprite.groupcollide(group1=bullets, group2=aliens, dokill1=True, dokill2=True, collided = None)
Run Code Online (Sandbox Code Playgroud)