In Python kann man durch Aliasing-Funktionen, die wiederholt verwendet werden, Bytes sparen. Beispielsweise:
r=range
a=r(100)
b=r(200)
c=r(300)
Wenn die Funktionen zusammen Elementfunktionen sind, kann ich sie jedoch nicht so aliasisieren, dass eine Verkettung möglich ist. Beispielsweise:
s='Hello'
// Plain code
s=s.replace('H','J').replace('e','i').replace('l','m').replace('o','y')
// What I am trying to do
q=replace
s=s.q('H','J').q('e','i').q('l','m').q('o','y')
Offensichtlich ist das, was ich versuche, nicht gültig. Und das ist auch nicht:
q=s.replace
s=q('H','J') // Replaces the 'H' in 'Hello'
s=q('e','i') // Replaces the 'e' in 'Hello'... and the J is gone.
s=q('l','m')
s=q('o','y')
Gibt es eine andere Möglichkeit, Mitgliedsfunktionen und verkettete Funktionen zu aliasen, um Zeichen zu speichern?
q
bedeutet, wasreplace
in der Klasse Ihre Verwendung bedeutet.q
ist an die Ersetzungsmethode dieser bestimmtenstr
Instanz gebunden ."Hello".replace(*"HJ")
Antworten:
Kein Problem! Sie können eine Methode aliasen, aber Sie müssen wissen, wie man sie verwendet:
Der Schlüssel ist, dass Sie
self
explizit übergeben müssen, da der Alias eine Art Funktion ist, die ein zusätzliches Argument benötigt, das Folgendes beinhaltetself
:quelle
Definieren Sie Ihre eigene Klasse mit einem kürzeren Methodennamen.
Wenn Sie beispielsweise
replace()
die zurString
Klasse gehörende Methode verwenden , können Sie Ihrer eigenen KlasseS
eine Methode mitq
dem gleichen Namen zuweisen.Hier ist eine Implementierung:
Hier ist eine viel bessere Implementierung:
Benutze es so:
quelle
Dies ist sowieso ein paar Zeichen kürzer
noch kürzer für eine kleine Anzahl von Ersatzteilen ist
Dies deckt natürlich nur einen bestimmten Fall ab. Beim Codegolf geht es jedoch nur darum, die Sonderfälle zu finden, die Ihnen Byte sparen können.
Es ist möglich, eine Wrapper-Funktion zu schreiben, die den allgemeinen Fall behandelt, aber der Code ist zu groß, um einen Platz in den meisten Code-Golf-Herausforderungen zu haben.
Sie müssen stattdessen denken: "Ich kann diese Transformation effizient (strichweise) mit str.replace durchführen. Kann ich die interne Darstellung meiner Lösung verschieben, um dies zu nutzen? (Ohne so viele Striche zu verschwenden, um den Vorteil zu negieren)."
quelle
Sie können die
reduce
Funktion verwenden.quelle
Wenn Sie viele Ersetzungen durchführen, können Sie dies tun:
quelle
[a]
)[a]
durch ersetzt werden.get(a,a)
(sonst bekommen wir eine Schlüsselfehlersache)? Und warumlist(s)
statts
?Wie wäre es mit der Definition einer Lambda-Funktion?
quelle
str.replace
/ ist / das Lambda! Siehe meine Antwort.Wenn Ihre Ersetzungen nicht angekettet werden müssen, können Sie "str.translate" verwenden. Die Zahlen sind die ASCII-Ordnungszahlen. Für diese Verwendung ist Python 3 erforderlich:
Probieren Sie es online aus
quelle