Почему порядок параметров имеет значение? - PullRequest
0 голосов
/ 18 декабря 2018

Так что я сам изучал Python и создавал Pygame («Alien Invasion») в книге.Следуя пошаговому объяснению, я понял, что у автора есть определенный порядок параметров в каждой функции.Например,

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 голосов
/ 18 декабря 2018

В большинстве других языков, таких как 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)
0 голосов
/ 18 декабря 2018

Используйте параметры подстановочных знаков и обрабатывайте их динамически.

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

0 голосов
/ 18 декабря 2018

Самый простой способ справиться с длинным списком параметров - это назвать отдельные параметры, а не полагаться на порядок:

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

Теперь вы можете видеть значения каждого параметра, не зная порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...