#--------- Operatore Lambda -------#
pr = lambda s:s
namenum = lambda x: (x==1 and pr("uno"))      \
                 or (x==2 and pr("due")) \
                 or (pr("altri"))
namenum(1)
# >>>'uno'
namenum(2)
# >>>'due'
namenum(3)
# >>>'altri'



#--------- map(...), reduce(...), filter(...) -------#
# Data una lista [2,1,2,-1,2] restituire una lista con tutti gli elementi > 0.
lista = [ 2, 1, 2, -1, 2]
def maggioredi0(x): return (x>0)
filter(maggioredi0,lista)
# oppure
filter(lambda x: x>0, lista)

# Data la lista [-2,-4,4,5,6,10] trovare tutti gli elementi minori di zero, e sommarvi 2.
lista=[-2, -4, 4, 5, 6, 10] 
def minoredi0(x): return (x<0)
def plus2(x): return(x+2)
map(plus2,(filter(minoredi0,lista)))
# oppure
map(lambda x:x+2, map(lambda x:x<0, lista))


# Data una lista restituisci il valore della somma di tutti i suoi elementi.
lista=[-2, -4, 4, 5, 6, 10] 
reduce(lambda n,m:n+m,lista)

# Data la lista [-2,-4,4,5,6,10] trovare tutti gli elementi minori di zero, e restituirne la somma.
lista=[-2, -4, 4, 5, 6, 10] 
def minoredi0(x): return (x<0)
reduce(lambda n,m:n+m,filter(minoredi0,lista))
# oppure
reduce(lambda n,m:n+m, filter(lambda x:x<0, list))



# esercizio fattoriale
# Versione imperativa
def fact(n):
    if n == 0:
        return 1
    return n * fact(n-1)

# Versione funzionale
fact_fun_no = lambda n: reduce(lambda x,y: x*y, map(lambda i: i+1, range(n+1)))
fact_fun_ok = lambda n: reduce(lambda x,y: x*y, [1] + range(1,n+1))



# Calcolo del numero di Eulero
n_euler = lambda n: reduce(lambda x,y: x+y, map(lambda z: 1./fact(z), range(n)))

