|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
[Python] Esercizio di programmazione funzionale
Buon giorno,
ieri sera mentre armeggiavo su internet ho dato uno sguardo alla programmazione funzionale. Così da bravo nerd stamattina di buon ora mi sono messo a fare qualche esercizio in python. Perché in python? Perché lo conosco già, haskell era da zero ma probabilmente lo imparerò presto. Comunque: Ho un dubbio sul seguente codice scritto da me: Codice:
from math import *
def mac(sig,coef):
'''Moltiplica e accumula i valori del segnale coi coefficienti'''
return reduce(lambda x,y: x+y,map(lambda x,y:x*y,sig,coef))
def buf_ins(buf,sig):
'''inserimento circolare nel buffer'''
for value in sig:
buf.insert(0,value)
buf.pop()
yield buf
def convolve(sig,fil):
'''1,2,3... Convoluzione! XD'''
buf = [0 for i in range(len(fil))]
#e forse si riesce pure ad eliminare il for...
for b in buf_ins(buf,sig):
yield mac(b,fil)
Il punto è che volevo eliminare il for nel metodo convolve usando map(): Codice:
map(mac,map(buf_ins,buf,sig),fil) Dove sbaglio? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Forse perché convolve è un generatore, visto che utilizza yield?
Comunque se posti qualche riga per testare quel codice è meglio, così si può fare qualche prova. P.S. Se t'interessa la velocità, al posto della lista tradizionale puoi usare la deque, che consente inserimento e rimozione in testa o coda in tempo costante, mentre le operazioni in testa nelle liste sono estremamente costose (lineari).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
uhmhm...
In realtà al momento la velocità non mi interessa granché ma terrò presente deque e la sostituirò. Io ho anche provato togliere yeld e a dire "ok, restituisco una lista". Comincio però a pensare che il problema sia che non ho capito come funziona map. map(buf_ins,buf,sig) mi ridà una lista di generatori, io invece pensavo mi desse una lista di numeri... Probabilmente è quello il problema. boh?... non lo so, domattina ci riprovo e posto eventuali soluzioni e il test. Buona notte |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ho capito. Il problema è buf_ins, che non è una normale funzione, ma un generatore.
map restituisce una lista, ma i cui elementi derivano dall'applicazione di buf_ins ai valori delle due liste che vengono passati come i due parametri che prevede. Poiché buf_ins è un generatore, è questo che verrà restituito da map per ogni singolo elemento.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
In ogni caso penso di studiare Haskell appena ho tempo, mi ha troppo preso questa cosa della programmazione funzionale! |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Francamente non faccio uso di map e reduce. Preferisco le list comprehension o le generator expression, oltre al modulo functools.
Comunque per la programmazione funzionale in Python c'è un ottimo tutorial nel sito ufficiale. P.S. Di Haskell non mi piace proprio la sintassi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:06.




















