Dies ist der erste Beitrag. Ich freue mich darauf, mit Dir zu arbeiten.
Ich werde Python zum ersten Mal seit einiger Zeit mit RaspberryPi berühren und die Ergebnisse notieren, die ich verfolgt habe, um es mir leichter zu machen.
Ich bin nicht besonders auf die sogenannte Dunkelheit ausgerichtet. Bitte lassen Sie mich wissen, wenn Sie nichts tun können.
Ich wusste vorher nicht, wie man Lambda benutzt. Ich denke, ich mag die Tatsache, dass es jetzt verschiedene Einschränkungen gibt. Ich möchte alles Mögliche in Lambda schreiben.
Nehmen wir ein Beispiel für eine schnelle Sortierung. Zuallererst in def?
def qs( xs ) :
le = [x for x in xs[1:] if x<=xs[0] ]
gt = [x for x in xs[1:] if x>xs[0] ]
if xs == []:
return []
else:
return qs( le ) + [ xs[0] ] + qs( gt )
Ist es so
Wenn Sie normal mit Lambda schreiben,
qs=(lambda xs :
[] if xs == [] else
qs( [x for x in xs[1:] if x<=xs[0] ] ) + [ xs[0] ]
+ qs( [x for x in xs[1:] if x>xs[0] ] )
)
Nicht schlecht, aber es fühlt sich lang und chaotisch an. Ich frage mich, ob das def wäre. Nach alldem. Es ist nicht möglich, einer Variablen in der Mitte zuzuweisen, aber es scheint, dass sie an einen Namen gebunden und definiert werden kann.
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
[] if xs == [] else
qs( le ) + [ xs[0] ] + qs( gt )
)()
)
Ist es nicht in Ordnung, sauber zu sein? Ich mag es, weil es keine Rückkehr gibt ... Erstellen Sie einen weiteren Lambda-Ausdruck und führen Sie ihn mit den Standardargumenten aus. Das bedeutet, dass die von Ihnen festgelegten Standardargumente als Variablen verwendet werden können, oder?
Sie können Argumente und Variablen außerhalb von Ihnen aus dem inneren Lambda-Ausdruck verwenden. Wenn Sie so etwas wie Lambda x = 1, y = x: tun, sucht y nach x außerhalb von Ihnen anstelle des nächsten x = 1. Argumente, die nicht verwandt sind, befinden sich im selben Lambda-Ausdruck. Wenn es eine Referenzbeziehung gibt, ändern Sie die Stufe. Die Anzahl der Stufen wird nach Bedarf erhöht oder verringert.
Übrigens scheint es besser, keine anderen dynamischen Standardargumente als Konstanten für die äußersten Argumente festzulegen. Der Standardwert bei der ersten Generierung wird aufgezeichnet und funktioniert normalerweise nicht wie erwartet.
Immerhin, was Sie mit Lambda machen wollen
Ich fühle mich wie ich dabei bin. Es ist ein wenig schmerzhaft, nur ~ wenn ~ sonst ~ verwenden zu können, wenn es viele Zweige gibt. Ich möchte zuerst die Bedingung und später die Operation schreiben!
Ich wollte es schaffen. Es hat jedoch nicht so viel Technik, also näherte ich mich ihm mit einem trügerischen Aussehen.
Bereiten Sie sich zuerst vor.
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox
Beim Benutzen
switch(
(Bedingung 1) and do(Ausführungsformel 1a,Ausführungsformel 1b,...)
or (Bedingung 2) and do(Ausführungsformel 2a,Ausführungsformel 2b,...)
...
or do(Letzte ausführbare Datei a,Letzte ausführbare Datei b,...)
)
Dies verzweigt bedingt, übergibt das Ergebnis als Taple an switch (), während die Ausdrücke in der Reihenfolge mit do () ausgewertet werden, und switch () gibt das letzte Element des Tapples zurück. Das letzte do () ist der Ausdruck, wenn alle Bedingungen falsch sind.
Der Zweck des Ein- und Auslegens in den Taple besteht darin, zu verhindern, dass der Rückgabewert des Ausführungsausdrucks die Steuerung von und / oder beeinflusst.
Es gibt keine besondere Bedeutung zu wechseln und zu tun. Ich dachte, dass es für Menschen so sein könnte, also habe ich es geändert. Es gibt keine Funktion, die man sich aus dem Namen vorstellen kann.
Im schnellen Sortierbeispiel
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
switch(
xs == [] and do( [] )
or do( qs( le ) + [ xs[0] ] + qs( gt ) )
)
)()
)
Die Anzahl der Zeichen hat etwas zugenommen, aber irgendwie scheint die Bedeutung vermittelt zu werden. Ich glaube nicht, dass ich einen Fehler machen werde.
Übrigens, wenn Sie das gleiche normal schreiben
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
(
xs == [] and ( [], )
or ( qs( le ) + [ xs[0] ] + qs( gt ) ,)
)[-1]
)()
)
Das ist ordentlich damit. Es ist ein Han. Aber ich bin mir nicht sicher, was ich tue, und wenn ich es schreibe, vergesse ich [-1] und Kommas.