[Python-de] lazy evaluation mit yield

Mark Zoeltsch zoeltsch at mooniewar.de
Fri Apr 19 14:52:43 EDT 2002


wenns jemanden interessiert...
nach dem ich jetzt ein bischen mich mit dieser
variablen Argumentzahl vertraut gemacht hab,
hab ich mich nochmal an die xmap gesetzt, da ich
gerne eine haette die sich wirklich wie map verhaelt,
aber eben nur 'lazy'

da meine erste Loesung total falsch war, und die Loesung 
von P.Norvig sich fuer den Fall:
xmap(lambda *x:x, 'abc', range(2))

anders verhaelt als:
map(lambda *x:x, 'abc', range(2))
(er schrieb ja in den docstring: 
stops when any sequence runs out of items)

hab ich das ganze nochmal umgeschrieben:

def xmap(funktion, *sequenz):
    """
    for Gerhard ;)
    Like map(fn, *seqs), but yields the results one at a time (lazy map).
    """
    _maxe = max(map(len,sequenz))#maximale Elemente
    sequenz = map(iter,sequenz)  #Sequenz ist jetzt eine Liste von Iteratoren
    
    def _tmp(sequenz): #kriegt man sowas in ein lambda gequetscht?
        try:
            return sequenz.next()
        except StopIteration:
            return None

    while _maxe > 0:
        yield funktion(*map(_tmp, sequenz))
        _maxe -= 1
    else:
        del _maxe, _tmp

jedenfalls verhielt sich diese xmap jetzt in allen meinen Tests wie die
built-in map, bin aber weiterhin fuer jede Kritik offen wenn ich was
uebersehen hab :)


SEE yA




More information about the Python-de mailing list