2013/9/18 Manlio Perillo <manlio.peri...@gmail.com>

> Peccato che flatten non sia disponibile in itertools, e non credo sia
>  implementabile in modo elegante.
>
>
Dipende cosa intendi con "elegante". A me questa non dispiace:

import collections as c

def flatten(obj):
    """
    >>> list(flatten(1))
    [1]
    >>> list(flatten([1, 2, 3]))
    [1, 2, 3]
    >>> list(flatten([1, [2, 3], [4, 5], 6]))
    [1, 2, 3, 4, 5, 6]
    """
    stack = [obj]
    while stack:
        current = stack.pop()
        if isinstance(current, c.Sequence):
            stack.extend(reversed(current))
        else:
            yield current


if __name__ == '__main__':
    import doctest
    doctest.testmod()

Facilmente adattabile per una flatmap alla ruby. Non e testata molto (come
si puo' vedere), ma sembra ragionevole.

Si, avrei potuto usare ricorsione esplicita invece dello stack, ma poi si
sarebbe complicata la gestione del generatore, temo.
Poi possiamo girarci intorno: Python supporta alcuni costrutti funzionali
ma quello che e' e rimane e' un linguaggio *imperativo* ad oggetti.
In pratica le parti veramente funzionali di python girano intorno ad
itertools e functools e a poche features del core (LC).

Insomma, Python e' un linguaggio che *sceglie* di avere degli statement e
non di essere tutto un'espressione. Vorra' pur dire qualcosa.

-- 
.
..: -enrico-
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a