Python: использование кода для написания кода — для новичка

Проблема, с которой я сталкиваюсь сейчас, заключается в загрузке набора звуковых файлов как их собственных объектов в Pygame. Вы загружаете звук с помощью этого синтаксиса:

sound1 = pygame.mixer.Sound('file.wav')

Скажем, у меня есть семь файлов, и я хочу, чтобы они были загружены и названы sound1 - sound7. И я не хотел загружать их каждый по отдельности. Если бы я не знал, что это ошибочно, я бы попробовал что-то вроде этого:

for i in range(1, 8):
    new = 'sound' + str(i)
    new = pygame.mixer.Sound(str(new) + 'wav')

Как мне сделать «новую» собственную переменную, а не строку? Я читал о getattr, но это сбивает с толку. Очень хотелось бы узнать, как использовать функции и циклы для динамического создания кода, но пока не могу найти ничего полезного для новичка вроде меня. Используя это в качестве примера, кто-нибудь хотел бы объяснить простым способом, как вы могли бы создавать код внутри кода и превращать строки в используемые переменные/объекты?

Благодарю вас!


person Aygtets    schedule 15.03.2013    source источник
comment
Вам нужно заглянуть в массивы - тогда вы можете обратиться, например. sound[2]   -  person Blorgbeard    schedule 15.03.2013
comment
К вашему сведению, форматирование строк обычно лучше, чем конкатенация строк: 'sound' + str(i) === 'sound%s' % i   -  person Hamish    schedule 15.03.2013
comment
Я думаю, что это отличный пример хорошего вопроса для новичка: пока вы совсем новичок, вы попробовали несколько подходов, провели небольшое исследование и объяснили, что искали. Тем не менее, я рекомендую полностью изучить некоторые учебные пособия по Python, которые познакомят вас со списками и словарями.   -  person David Robinson    schedule 15.03.2013


Ответы (3)


sounds = [] # list
for i in range(1, 8):
    sounds.append(pygame.mixer.Sound('sound' + str(i) + 'wav'))

Or

sounds = {} # dictionary
for i in range(1, 8):
    sounds[i] = pygame.mixer.Sound('sound' + str(i) + 'wav')

Сначала кажется, что вы используете подход словаря так же, как подход списка, например. звуки[1] звуки[2] и так далее, но вы также можете сделать это:

sounds = {} # dictionary
for i in range(1, 8):
    sounds['sound' + str(i)] = pygame.mixer.Sound('sound' + str(i) + 'wav')

А теперь звуки["sound1"] и так далее работают, например.

person Patashu    schedule 15.03.2013
comment
На самом деле, словарь здесь не нужен, но он был бы отличен в одном случае использования: sounds{"ding"} = pygame.mixer.Sound("ding.wav") - тогда вы можете использовать название звука для поиска звука, что-то вроде sounds{"ding"}.play(). - person paxdiablo; 15.03.2013
comment
Верно, если вы просто проиндексируете его по номеру, он делает то же самое, но если вы предпочитаете индексировать по другим вещам, например, по названию звука, это большое улучшение. - person Patashu; 15.03.2013

Для этого вы можете использовать массивы:

sound = []
for i in range(1,8):
    sound.append (pygame.mixer.Sound("sound%d.wav" % i))
# Now use sound[0..6] to reference sound[1..7].wav

Это загрузит файлы с sound1.wav по sound8.wav - если ваши файлы названы по-другому, вы просто меняете диапазон и/или форматирование строки.

person paxdiablo    schedule 15.03.2013

В питоне есть два вида циклов: цикл for и цикл while. Цикл for используется для повторения чего-либо n раз. Цикл while используется для повторения до тех пор, пока что-то не произойдет. Циклы for полезны для программирования игр, поскольку они часто обрабатывают кадры, отображаемые игрой. Каждый кадр проходит один раз через цикл. Способ хранения цикла for — это список. Вот пример базового цикла, с которым вы можете ознакомиться:

he_count = [1, 2, 3, 4, 5]
fruits = ['apples', 'oranges', 'pears', 'apricots']
change = [1, 'pennies', 2, 'dimes', 3, 'quarters']

# this first kind of for-loop goes through a list
for number in the_count:
    print "This is count %d" % number

# same as above
for fruit in fruits:
    print "A fruit of type: %s" % fruit

# also we can go through mixed lists too
# notice we have to use %r since we don't know what's in it
for i in change:
    print "I got %r" % i

# we can also build lists, first start with an empty one
elements = []

# then use the range function to do 0 to 5 counts
for i in range(0, 6):
    print "Adding %d to the list." % i
    # append is a function that lists understand
    elements.append(i)

# now we can print them out too
for i in elements:
    print "Element was: %d" % i

Вы можете узнать больше о циклах и программировании игр на Python здесь: programarcadegames.com/index.php? lang=ru&chapter=циклы

person PhilFredo    schedule 15.03.2013