2016-12-21 2 views
0

Возьмем такой пример:вызова функции из списка в Python

presets = [ 
    "eggs", 
    "bacon" 
    ] 

print(presets[0]) 
>>> eggs 

Почему может сделать не делать то же самое, со списком элементов для выполнения? Возьмем такой пример:

from animations import animation_2, animation_3, animation_4 
presets = [ 
    animation_2.iterate(animations_templates_path, thumbnails_final), 
    animation_3.iterate(animations_templates_path, thumbnails_final), 
    animation_4.iterate(animations_templates_path, thumbnails_final) 
    ] 

Когда я запускаю это (как с и без preset[n]) он выполняет все три команды в списке. Почему это? Я хотел бы иметь список этих пресетов и называть их через номер индекса am. Что я делаю не так?

+1

Вы можете сделать ** точно такую ​​же вещь **, * если * вы храните вызовы, а не результат их вызова. Просто храните, например. 'animation_2.iterate', а затем передать аргументы, когда вы забираете их * out * из списка. – jonrsharpe

+0

Хранить как 'presets = [animation_2.interate, ...]'. Затем позвоните по телефону .............................................. 'presets [0] (animations_templates_path, thumbnails_final)' – pylang

+0

Если вы видели '[factorial (4), factorial (5)]' в программе, считаете ли вы, что первым элементом этого списка является команда, которую вы можете получить и выполнить позже , или вы думаете, что это факториал 4? То же самое с вашим кодом. – user2357112

ответ

1

Вы можете сохранить фактические функции объектов в списке

from animations import animation_1, animation_2, animation_3 
presets = [ 
    animation_2.iterate, 
    animation_3.iterate, 
    animation_4.iterate 
    ] 

Затем вызовите требуемую функцию, основанную на индексе. Таким образом, функция не выполняется при построении list, а выполняется только после ее вызова.

presets[0](animations_templates_path, thumbnails_final) 
+0

Это именно то, что я искал. Спасибо! –

2

Он выполняет элементы, потому что это то, что вы говорите ему. Ваш код точно так же, как это:

p1 = animation_2.iterate(animations_templates_path, thumbnails_final) 
p2 = animation_3.iterate(animations_templates_path, thumbnails_final) 
p3 = animation_4.iterate(animations_templates_path, thumbnails_final) 
presets = [p1, p2, p3] 

Python не имеет возможности узнать, что вы не намерены вызывать эти функции.

Одно решение для хранения кортеж:

presets = [ 
    (animation_2.iterate, animations_templates_path, thumbnails_final), 
    (animation_3.iterate, animations_templates_path, thumbnails_final), 
    (animation_4.iterate(animations_templates_path, thumbnails_final), 

]

Это сохраняет функцию и аргументы без вызова функции. Вы можете перебирать список позже и выполнять функцию.

+0

Это очень полезно, когда я могу понять, что я делаю. Тем не менее, я собираюсь отметить другой ответ как решение, потому что в моем случае использования он позволяет мне писать меньше кода и перебирать его проще. –

Смежные вопросы