2016-12-08 2 views
0

У меня есть функция, которая принимает два аргумента. Я хочу запустить функцию для каждой возможной комбинации моих входов и сохранить каждое возвращаемое значение. Например:Python вызывает функцию много раз с разными аргументами

def foo(a, b): 
    return (a + b) 

if __name__ == "__main__": 
    a = np.array([1., 2., 3.]) 
    b = np.array([5., 6.]) 
    f1 = foo(a[0], b[0]) #6 
    f2 = foo(a[0], b[1]) #7 
    f3 = foo(a[1], b[0]) #etc 
    f4 = foo(a[1], b[1]) 
    f5 = foo(a[2], b[0]) 
    f6 = foo(a[2], b[1]) 

Как я могу назвать f1 через f6 более элегантным способом, как цикл? Это не может быть прямой цикл, потому что a и b имеют различное количество элементов.

+1

Посмотрите на 'itertools.product'. – jonrsharpe

+0

См. Http://stackoverflow.com/questions/1919044/is-there-a-better-way-to-iterate-over-two-lists-getting-one-element-from-each-l – jarmod

+0

Вложенные в петли? – haifzhan

ответ

3

itertools.product - это путь к путинской манере. Однако, если вы ищете более сырой, базовый способ, вам понадобятся два цикла, которые являются основным свойством перекрестного продукта.

for i in a: 
    for j in b: 
     foo(i, j) 

Edit:

Пример Обычаи itertools.product:

for i, j in itertools.product(a, b): 
    foo(i, j) 

for tup in itertools.product(a, b): 
    foo(*tup) 

Я предпочитаю первый, потому что элементы кортежа могут быть использованы в явном виде, если это необходимо.

+0

Спасибо @ Rockybilly, но я думаю, что у меня что-то не хватает. itertools.product возвращает кортеж, а затем я должен каким-то образом передать это своей функции. Я видел [это] (http://stackoverflow.com/questions/1993727/expanding-tuples-into-arguments), но на самом деле не понял. Могли бы вы показать MWE, используя itertools.product, а затем подавать его в функцию? – StatsSorceress

+0

@StatsSorceress Проверьте изменения. – Rockybilly

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