2010-08-05 2 views
0

Как реализовать векторную сумму, используя функциональное программирование в python.
Этот код для работы п < 100, но не для п> 1000.Векторная алгебра в функциональном состоянии

from itertools import * 

#n=10000 # do not try!!! 
n=100 
twin=((i,i**2,i**3) for i in xrange(1,n+1)) 

def sum(x=0,y=0): 
    return x+y 

def dubsum(x,y): 
    return (reduce(sum,i) for i in izip(x,y)) 

print [ i for i in reduce(dubsum,twin) ] 
+0

Вы знаете, '(е (х) при х в итерацию)' не создает кортеж. Python видит круглые скобки вокруг одного объекта, генератора и просто возвращает этот объект. Если вы хотите создать кортеж, вам нужно использовать 'tuple (f (x) для x в iterable)'. –

+0

Я не хотел создавать кортеж –

ответ

2

Как это:

print [sum(e) for e in izip(*twin)] 

Или еще более функционально:

print map(sum, izip(*twin)) 

Заметим, что проносясь является очень похоже на перенос двумерного массива.

>>> zip([1, 2, 3, 4], 
...  [5, 6, 7, 8]) == [(1, 5), 
...       (2, 6), 
...       (3, 7), 
...       (4, 8)] 
True 
+0

Что означает * twin означает? –

+2

'* twin' распаковывает элементы' twin' перед передачей их функции. Если 'twin' является' ((1,1,1), (2,4,8)), то 'izip (twin)' будет 'izip (((1,1,1), (2,4, 8))) ', но' izip (* twin) 'будет' izip ((1,1,1), (2,4,8)) '. Проверьте учебное пособие в документации в разделе «распаковка списков аргументов». –

0

Python построил в сумме, зачем:

from itertools import * 

n=10000 
twin=((i,i**2,i**3) for i in xrange(1,n+1)) 
x,y,z= izip(*twin) 

print sum(x),sum(y),sum(z) 
Смежные вопросы