为什么参数顺序很重要?

时间:2018-12-17 22:15:03

标签: 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()

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

3 个答案:

答案 0 :(得分:4)

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

例如:

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

int main()
{
    my_function("item1", 10, 'c')
}

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

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

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

my_function(size=4, name="item1", type=d)

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

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

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

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

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

my_function("item1", size=4, type=d, id=3)

但是您不能这样做:

my_function("item1", size=4, d, 3)

因为它现在不知道您是要为d设置id还是为d设置type,反之亦然。


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

如果您去这里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)

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

  pygame.sprite.groupcollide(group1=bullets, group2=aliens, dokill1=True, dokill2=True, collided = None)

答案 1 :(得分:1)

处理长参数列表的最简单方法是命名各个参数,而不是依赖顺序:

check_bullet_alien_collisions(ai_settings=AiSettings, screen=Screen, stats=Stats, sb=SB, ship=Ship, aliens=Aliens, bullets=Bullets)

现在您可以在不知道顺序的情况下查看每个参数的值。

答案 2 :(得分:0)

使用通配符参数并动态处理它们。

def check_bullet_alien_collisions(*args, **kwargs):
    ai_settings = args[0]
    screen = kwargs.get('screen')

如果需要,这还允许您传递其他功能的参数。

http://book.pythontips.com/en/latest/args_and_kwargs.html