因此,我一直在自学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()
我假设此函数中的这些参数可同时工作,因此顺序并不重要,但显然很重要。但是我如何确定哪一个先到最后呢?我该如何确定哪个应该是第一个和最后一个?
答案 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')
如果需要,这还允许您传递其他功能的参数。