5.15.3 Ricette

Questa sezione mostra delle ricette per creare ed estendere i toolset usando gli itertools esistenti come elementi base.

I tool estesi offrono le medesime alte prestazioni del toolset sottostante. Le prestazioni superiori nell'utilizzo della memoria vengono mantenute elaborando un singolo elemento alla volta piuttosto che immettendo in un sol colpo in memoria l'intero iterabile . Il volume del codice viene mantenuto piccolo collegando i tool fra loro usando uno stile funzionale che aiuta ad eliminare le variabili temporanee. L'alta velocità viene ottenuta preferendo elementi base ``vettorizzati'', al posto dell'utilizzo di cicli for e generatori che causano l'overhead dell'interprete.

def take(n, seq):
    return list(islice(seq, n))

def enumerate(iterable):
    return izip(count(), iterable)

def tabulate(function):
    "Restituisce function(0), function(1), ..."
    return imap(function, count())

def iteritems(mapping):
    return izip(mapping.iterkeys(), mapping.itervalues())

def nth(iterable, n):
    "Restituisce l'n-esimo elemento"
    return list(islice(iterable, n, n+1))

def all(seq, pred=bool):
    "Restituisce True se pred(x) è vero per ogni elemento di iterable"
    return False not in imap(pred, seq)

def any(seq, pred=bool):
    "Restituisce True se pred(x) è vero per almeno un elemento di iterable"
    return True in imap(pred, seq)

def no(seq, pred=bool):
    "Restituisce True se pred(x) è falso per ogni elemento di iterable"
    return True not in imap(pred, seq)

def quantify(seq, pred=bool):
    "Conta quante volte il predicato è vero nella sequenza"
    return sum(imap(pred, seq))

def padnone(seq):
    """Restituisce gli elementi della sequenza e poi None indefinitamente

    Utile per emulare il comportamento della funzione built-in map().

    """
    return chain(seq, repeat(None))

def ncycles(seq, n):
    "Restituisce gli elementi della sequenza ripetuti n volte"
    return chain(*repeat(seq, n))

def dotproduct(vec1, vec2):
    return sum(imap(operator.mul, vec1, vec2))

def flatten(listOfLists):
    return list(chain(*listOfLists))

def repeatfunc(func, times=None, *args):
    """Ripete le chiamate a func con gli argomenti specificati.

    Esempio:  repeatfunc(random.random)

    """
    if times is None:
        return starmap(func, repeat(args))
    else:
        return starmap(func, repeat(args, times))

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    try:
        b.next()
    except StopIteration:
        pass
    return izip(a, b)
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.