Как эта спецификация c double для l oop работает в python? Объясняя двойной цикл - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь понять и применить этот однолинейный дубль для l oop вне пигмея. Удвоение для l oop:

for m in (move_map[key] for key in move_map):

Это первоначально из кода, который, id имя: sloth, написал на странице:

Pygame: key.get_pressed ( ) не совпадает с очередью событий

#the list
move_map = {pygame.K_LEFT: pygame.Vector2(-1, 0),
            pygame.K_RIGHT: pygame.Vector2(1, 0),
            pygame.K_UP: pygame.Vector2(0, -1),
            pygame.K_DOWN: pygame.Vector2(0, 1)}

#in the game loop 
for m in (move_map[key] for key in move_map if pressed[key]):

Сначала я сделал печать (m), чтобы понять механику (которая работала):

move_map = {pygame.K_LEFT: pygame.Vector2(-1, 0),
            pygame.K_RIGHT: pygame.Vector2(1, 0),
            pygame.K_UP: pygame.Vector2(0, -1),
            pygame.K_DOWN: pygame.Vector2(0, 1)}

for m in (move_map[key] for key in move_map):
    print(m)

Я ошарашил даже больше, но не сработало:

move_map = {(-1, 0),
            (1, 0),
            (0, -1),
            (0, 1)}

for m in (move_map[key] for key in move_map):
    print(m)

Может ли кто-нибудь дать мне простой пример того, как это использовать?

1 Ответ

4 голосов
/ 30 апреля 2020

Эта функция называется списком, и вы можете прочитать об этом в документации здесь , идея в том, что она позволяет создавать список с меньшим синтаксисом. Более кратко вы могли бы взглянуть на понимания вложенного списка

Чтобы ответить на ваш вопрос, простой пример того, как его использовать:

words = "foo bar baz"
print([char for word in words.split() for char in word])

, который выводит:

['f', 'o', 'o', 'b', 'a', 'r', 'b', 'a', 'z']

И эквивалентен:

letters = []
for word in words.split():
    for char in word:
        letters.append(char)
print(letters)

Тот, который вы упомянули, немного сложнее, потому что он вводит оператор if в середине:

for m in (move_map[key] for key in move_map if pressed[key]):
    print(m)

Is эквивалентно:

movements = []
for key in move_map:
    if pressed[key]:
        movements.append(move_map[key])
for m in movements:
    print(m)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...