Zunächst einmal eingeführt wurde, beachten Sie bitte, dass die „Pattern Matching“ von funktionalen Sprachen und die Zuordnung zu Tupeln, die Sie erwähnen, sind nicht wirklich so ähnlich. In funktionalen Sprachen werden die Muster verwendet, um partielle Definitionen einer Funktion zu geben.So f (x : s) = e
bedeutet nicht, den Kopf nehmen und Schwanz des Arguments von f
und zurück e
sie verwenden, aber es bedeutet, dass wenn das Argument der f
der Form ist x : s
(für einige x
und s
), dannf (x : s)
ist gleich e
.
Die Zuordnung von Python ist eher wie eine Mehrfachbelegung (ich vermute, dass das seine ursprüngliche Absicht war). Sie schreiben also beispielsweise x, y = y, x
, um die Werte in x
und y
zu tauschen, ohne eine temporäre Variable zu benötigen (wie bei einer einfachen Zuweisungsanweisung). Dies hat wenig mit dem Mustervergleich zu tun, da es im Grunde eine Kurzform für die "gleichzeitige" Ausführung von x = y
und y = x
ist. Obwohl Python beliebige Sequenzen anstelle von durch Kommas getrennten Listen erlaubt, würde ich nicht empfehlen, dieses Muster als übereinstimmend zu bezeichnen. Bei der Mustererkennung prüfen Sie, ob etwas mit einem Muster übereinstimmt oder nicht; In der Python-Zuweisung sollten Sie sicherstellen, dass die Sequenzen auf beiden Seiten gleich sind.
zu tun, was Sie scheinen Sie in der Regel (in funktionalen Sprachen) entweder eine Hilfsfunktion verwenden würde zu wollen (wie von anderen erwähnt) oder etwas ähnliches zu let
oder where
Konstrukte (die Sie als mit einem anonymen Funktionen betrachten kann). Zum Beispiel:
(head, tail) = (x[0], x[1:]) where x = my_func()
Oder in tatsächlichem Python:
(head, tail) = (lambda x: (x[0], x[1:]))(my_func())
Beachten Sie, dass dies im Wesentlichen der gleichen wie die von anderen mit einer Hilfsfunktion, außer dass diese gegebenen Lösungen ist der Einzeiler wollten Sie . Es ist jedoch nicht unbedingt besser als eine separate Funktion.
(Sorry, wenn meine Antwort ein wenig übertrieben ist. Ich denke einfach, ist es wichtig, den Unterschied deutlich zu machen.)
Natürlich können Sie diese Lambda auf der gleichen Linie mit allem anderen setzen kann: Kopf, Rest = (lambda lst: (lst [0], lst [1:])) (my_func()) –
Ja, aber das beginnt an der Verschleierung zu beginnen. –
+1 für die neue Funktion Python 3 und Verknüpfung mit dem PEP. – fossilet