[Python-de] lazy evaluation mit yield

Mark Zoeltsch zoeltsch at mooniewar.de
Fri Apr 19 10:57:35 EDT 2002


Erst mal danke an euch beide!!
Als ich drueber geschlafen hab, ist es mir auch eingefallen wozu
dieses * dienen koennte (und es dann auch tut)

naemlich das was auch schon  Georg geschrieben hat:
xmap(f, 1, 2, 3, 4)

danke schon mal an euch beide


> Ich finde auf der Seite nix bzgl. xmap, noch nicht mal bzgl.
> Generatoren. Bist du dir sicher, dass du es nicht von irgendeiner
> Obfuscated Python Seite hast? ;-)

:) ja sicher ist ein bischen versteckt und zwar in seiner util.py
die er immer benutzt:
http://www.norvig.com/python/utils.html

einfach nach xmap suchen die sieht bei ihm so aus:

def xmap(fn, *seqs):
    """Like map(fn, *seqs), but yields the results one at a time.
    Also, it stops when any sequence runs out of items."""
    seqs = map(iter, seqs)
    fn = fn or (lambda *x: x)
    while 1:
        yield fn(*map(lambda seq: seq.next(), seqs))

das fn = fn or lambda *x:x hab ich weggelassen da ich nicht so ein
freund von kryptischen moeglichkeiten bin, d.h. es mag zwar
nett sein mit xmap(0,....) zu erreichen das lambda *x:x eingesetzt
wird, jedoch kann man sowas nicht wissen wenn man sich nicht
den code der xmap ansieht


> Da fehlt der Docstring, was das Teil überhaupt machen soll ;-) Dass der
> Parameter von Lambda genauso heißt wie die Sequenz (2.  Parameter) von
> map, naja :-/

Wegen dem fehlendem docstring... wollte loc sparen ;)
Das ich den Parameter genauso nenne ist mir persoenlich lieber, denn so
weiss ich immer auf einen Blick, auf was es letztendlich Bezug nimmt.
Finde ich praktischer.

Es macht das was ich im subject geschrieben hab eine lazy evaluation fuer
eine map Funktion, sprich es berechnet den "Wert" erst wenn
es gebraucht wird und nicht alles auf einen Rutsch, das hat den Vorteil
das man auch sehr grosse Sequenzen ohne Speicherprobleme verarbeiten
kann. Denn spaetestens bei map mit range(1000000) kommt eine
riesige Liste zurueck. Auf die Idee sowas mit map, reduce, usw zu machen,
kommt man spaetestens wenn man was ueber xrange gelesen hat :)

Verwenden kann man es dann wie folgt z.B:

for i in xmap(lambda x:x, range(10)):
   print i,

(Der Nachteil ist bei so einer kleinen Sequenz das die Beeintraechtigung durch
die Ausfuehrungszeit wesentlich hoeher ist, als der Nutzen ueber den
eingesparten Speicher.)

Ansonsten danke euch fuer die Links, jetzt weiss ich das man es als
Variable Argumentliste bezeichnet, btw. das mit dem ** ist interessant :)


SEE yA




More information about the Python-de mailing list