funktionen definieren: def vs. lambda (newbee)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
kommando_pimperlepim
User
Beiträge: 23
Registriert: Dienstag 3. April 2007, 05:32

Montag 28. Mai 2007, 11:11

ich bin mir in letzter zeit immer wieder unsicher, ob ich richtig handle, wenn ich zwei funktionen definiere, wobei eine die andere verwendet. in welchem fall ist es richtig, davon auszugehen, dass die eine funktion die andere "kennt"? zunächst funktionieren alle der folgenden 4 möglichkeiten:

Code: Alles auswählen

# beispiel 1 
def f1(x):
    return x+1
def f2(x):
    return f1(x)+1
print f2(1)

# beispiel 2
f1 = lambda x: x+1
def f2(x):
    return f1(x)+1
print f2(1)

# beispiel 3
def f1(x):
    return x+1
f2= lambda x: f1(x)+1
print f2(1)

# beispiel 4
f1 = lambda x: x+1
f2 = lambda x: f1(x)+1
print f2(1)
könnte es passieren, dass bei einem import von f2 aus beispiel 1 oder 2 durch eine externe py-datei probleme auftreten?
ist eine der 4 möglichkeiten aus anderen gründen den anderen vorzuziehen?
oder sind sie alle komplett gleichwertig?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 28. Mai 2007, 11:14

Ob du eine Funktion nun per ``lambda`` oder ``def`` definierst ist, wenn die Funktion schon existiert völlig egal. Sie verhalten sich beide wie ``Callables``. Der einzige Unterschied in ``lambda`` ist, dass man keine Statements nutzen kann (also keine Schlüsselwörter), was lambda zu einer recht beschränkten Sache macht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
kommando_pimperlepim
User
Beiträge: 23
Registriert: Dienstag 3. April 2007, 05:32

Montag 28. Mai 2007, 12:35

vielen dank für die schnelle antwort, Leonidas.
weiß jemand, ob es performanceunterschiede gibt?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 28. Mai 2007, 16:55

Testen? Mit ``timeit`` hast du schon das passende Modul zur Hand, im Wiki wird auch erklärt wie man es nutzt.

Aber ich persönlich finde es sinnlos, sowas auf Performance-Unterschiede zu testen: "Premature optimalization is the root of all evil" (das sollte in den Zen aufgenommen werden). Nimm das was leserlicher ist. Oder das wann an einer gegebenen Stelle sinnvoll ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Montag 28. Mai 2007, 17:20

für normale Funktionen nutzen alle def.
lambda sieht man immer nur um 'einzeilige' Funktionen zu defenieren.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 28. Mai 2007, 19:23

kommando_pimperlepim hat geschrieben:vielen dank für die schnelle antwort, Leonidas.
weiß jemand, ob es performanceunterschiede gibt?
Ja. Es gibt absolut keine, weder bei der Definition noch der Ausführung.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Montag 28. Mai 2007, 20:55

hmm...

ich hab lambda noch nicht "verstanden" :) wofür kann man das wirklich mal brauchen?

lgherby
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 28. Mai 2007, 21:11

Zum Beispiel für

Code: Alles auswählen

l = [("hello", 0), ("World", 1), ("world", 2), ("HELLo", -10)]
l.sort(key=lambda x: x[0].lower())
Das gleiche könnte man natürlich auch mit einer Funktion mit Namen machen:

Code: Alles auswählen

l = [("hello", 0), ("World", 1), ("world", 2), ("HELLo", -10)]
def keyfunc(x):
    return x[0].lower()
l.sort(key=keyfunc)
Für solche Oneliner-Funktionen ist lambda aber wirklich schöner.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Montag 28. Mai 2007, 22:01

Es gibt auch einen Einsatzfall wo man es braucht.
Um beim drücken von GUI Buttons Variablen zuübergeben siehe:
http://www.python-forum.de/topic-8813.html
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 28. Mai 2007, 22:05

Brauchen tut man es nie. Man kann *immer* eine entsprechende Funktion mit `def` erstellen.

Die Frage ist nur, was schöner und besser lesbar ist.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
kommando_pimperlepim
User
Beiträge: 23
Registriert: Dienstag 3. April 2007, 05:32

Dienstag 29. Mai 2007, 06:42

danke für deine hilfe, birkenfeld.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Dienstag 29. Mai 2007, 08:20

@birkenfeld wenn du bei GUI Variablen übergabe auf lambda verzichtest, hilft da auch kein def. Da muss man schon auf globals zurückgreifen
Oder wie wäre deine Lösung?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Dienstag 29. Mai 2007, 08:26

Sehen wir uns doch das Beispiel aus dem verlinkten Post an:

Code: Alles auswählen

class ClassTKWINDOW:
    def __init__(self,master):
        self.but = Button(master, text="test", command=lambda: textmalen('hallo welt'))
        self.but.pack() 
Das geht auch mit einer Funktion mit Namen:

Code: Alles auswählen

class ClassTKWINDOW:
    def __init__(self,master):
        def callback():
            textmalen('hallo welt')
        self.but = Button(master, text="test", command=callback)
        self.but.pack() 
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Dienstag 29. Mai 2007, 11:32

ach die möglichkeit hatte ich vergessen man kann ja funktionen in funktionen schreiben und diese funktionen haben zugriff auf die variablen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 29. Mai 2007, 11:35

Sr4l hat geschrieben:ach die möglichkeit hatte ich vergessen man kann ja funktionen in funktionen schreiben und diese funktionen haben zugriff auf die variablen.
Davon abgesehen sieht man ``lambda``s hauptsächlich in Tkinter. In anderen Toolkits kann man Callback-Funktionen Parameter mitgeben, bzw. die wichtigsten Parameter werden implizit mitgegeben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten