Python 为什么参数的顺序很重要?

Python 为什么参数的顺序很重要?,python,parameters,pygame,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 t

所以我一直在自学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()

我假设这个函数中的这些参数同时工作,所以顺序并不重要,但显然它确实重要。但我怎么知道谁先来,谁后来?如何决定哪个应该是第一个和最后一个?

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

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

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

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

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

现在你可以知道每个参数的值是什么,而不知道顺序。

< P>在大多数其他语言中,比如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)
因为它现在不知道您是要为id设置d还是为类型设置d,反之亦然

你的问题是如何知道函数希望数组的顺序。最好的方法是阅读您正在使用的函数的文档

如果你去这里

您可以找到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)

在大多数其他语言中,例如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)
因为它现在不知道您是要为id设置d还是为类型设置d,反之亦然

你的问题是如何知道函数希望数组的顺序。最好的方法是阅读您正在使用的函数的文档

如果你去这里

您可以找到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)

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

def check_bullet_alien_collisions(*args, **kwargs):
    ai_settings = args[0]
    screen = kwargs.get('screen')
这还允许您在需要时传递其他函数的参数


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

def check_bullet_alien_collisions(*args, **kwargs):
    ai_settings = args[0]
    screen = kwargs.get('screen')
这还允许您在需要时传递其他函数的参数


非关键字参数(又称位置参数)通过顺序与函数定义中的名称相对应。如果您搜索短语Python函数参数顺序,您将找到比我们在这里的答案中更好地解释它的资源。谢谢,我将实际搜索它!!!!我只是在stackoverflow中搜索,没有找到任何让我满意的答案…非关键字参数(又称位置参数)通过顺序与函数定义中的名称相对应。如果你搜索短语Python函数参数顺序,你会找到比我们在这里的答案更好的资源来解释它。谢谢
“我会用谷歌搜索的!!!!”!!!!我只是在stackoverflow中搜索,没有找到任何让我满意的答案…排序并不总是那么复杂:def funca,b:vs def funcb,a是可读性和个人偏好的问题,除非它们会对彼此产生副作用。非常感谢您提供详细的答案。我现在明白了!排序并不总是那么复杂:def funca,b:vs def funcb,a是一个可读性和个人偏好的问题,除非它们会相互产生副作用。非常感谢您提供详细的答案。我现在明白了!