[Python-de] lazy evaluation mit yield

Gerhard Häring haering_python at gmx.de
Fri Apr 19 03:22:12 EDT 2002


* Mark Zoeltsch <zoeltsch at mooniewar.de> [2002-04-18 22:12 +0200]:
> Hallo!
> 
> Ich hab vor einiger Zeit Peter Norvig's IAQ 
> (http://www.norvig.com/python-iaq.html) gefunden,
> und habe dort seine Implementation einer xmap mittels
> generator gefunden:

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? ;-)

> >from __future__ import generators
> 
> def xmap(funktion, *sequenz):
>     #etwas modifiziert von mir
>     print type(sequenz),sequenz
>     sequenz = map(iter,sequenz) #sequenz ist jetzt ein Iterator
>     while 1:
>         yield funktion(*map(lambda sequenz:sequenz.next(), sequenz))

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 :-/

> so jetzt frag ich mich wieso er es so programmiert,
> ich muss dazu erwaehnen das mir dieses * vor sequenz
> bzw. vor map nicht ganz geheuer ist, ich weiss zwar 
> was es letztendlich bewirkt, kenn aber nicht ganz das warum 

> (hat dieses * in diesem Zusammenhang eine bestimmte Bezeichnung?  Ich
> hab in der Literatur bisher nichts finden koennen, nicht mal eine
> Erwaehnung das es sowas ueberhaupt gibt...ich lese die falschen
> Buecher...)

http://www.python.org/doc/current/ref/function.html

Wenn man eine Funktionsdeklaration hat wie

    def foo(*x):
        ...

und man foo mit foo(1,2,3) aufruft, wird der Parameter x in der Funktion
auf das Tupel (1,2,3) gesetzt.

Umgekehrt wenn man eine Funktion

    def foo(a, b, c):
        ...

hat und diese wie folgt aufruft:

    params = (1,2,3)
    foo(*params)

wird beim Funktionsaufruf das Tupel entpackt.

> Jedenfalls kommt es mir umstaendlich vor, aber das hat sicherlich
> seinen Grund
> 
> Da ich nicht ganz verstehe warum so, hab ich mal
> meine Version gebastelt:
> 
> def xmap2(funktion, sequenz):
>     for e in sequenz:
>         yield funktion(e)
> 
> und frag mich jetzt was dagegen spricht, sicherlich irgendwas aber was?

Auch hier sagst du nicht, was es machen soll, darum kann ich dazu nicht
viel sagen. xmap und xmap2 sind aber mit Sicherheit nicht äquivalent.

Gerhard
-- 
This sig powered by Python!
Außentemperatur in München: 7.1 °C      Wind: 2.4 m/s



More information about the Python-de mailing list