En Python, on peut enregistrer des octets en aliasant des fonctions qui sont utilisées à plusieurs reprises. Par exemple:
r=range
a=r(100)
b=r(200)
c=r(300)
Cependant, lorsque les fonctions sont des fonctions membres ensemble, je ne sais pas comment les alias d'une manière qui permette le chaînage. Par exemple:
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')
De toute évidence, ce que j'essaie de faire n'est pas valide. Et ce n'est pas non plus:
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')
Existe-t-il une autre façon d'alias les fonctions membres et les fonctions chaînées qui enregistre les caractères?
q
signifiant ce quereplace
signifie dans la classe que vous utilisez.q
est lié à la méthode replace de cettestr
instance spécifique . N'oubliez pas non plus que vous pouvez effectuer des remplacements avec un seul caractère avec"Hello".replace(*"HJ")
Réponses:
Pas de problème! Vous pouvez alias une méthode, mais vous devez savoir comment l'utiliser:
La clé est que vous devez passer
self
explicitement, car l'alias est une sorte de fonction qui prend un argument supplémentaire qui prendself
:la source
Définissez votre propre classe, avec un nom de méthode plus court.
Par exemple, si vous utilisez la méthode
replace()
appartenant à laString
classe, vous pouvez faire en sorte que votre propre classeS
ait une méthode appeléeq
qui fait la même chose.Voici une implémentation:
Voici une bien meilleure implémentation:
Utilisez-le comme ceci:
la source
C'est quand même quelques caractères plus courts
encore plus court pour un petit nombre de remplacements est
bien sûr, cela ne couvre qu'un cas particulier. Cependant, le golf de code consiste à trouver ces cas spéciaux qui peuvent vous faire économiser des octets.
Il est possible d'écrire une fonction wrapper qui gère le cas général, mais le code sera trop volumineux pour avoir une place dans la plupart des défis de golf de code.
Au lieu de cela, vous devez penser "Je peux effectuer cette transformation efficacement (en traits) avec str.replace. Puis-je changer la représentation interne de ma solution pour en profiter? (Sans gaspiller autant de traits pour annuler l'avantage)"
la source
Vous pouvez utiliser la
reduce
fonction.la source
Si vous faites beaucoup de remplacements, vous pouvez le faire:
la source
[a]
)[a]
être remplacé par.get(a,a)
(sinon, nous obtenons une erreur clé)? Et pourquoi avoirlist(s)
au lieu des
?Que diriez-vous de définir une fonction lambda?
la source
str.replace
/ c'est / que lambda! Voir ma réponse.Si vos remplacements n'ont pas besoin d'être enchaînés, vous pouvez utiliser `str.translate '. Les nombres sont les ordinaux ASCII. Son utilisation de cette façon nécessite Python 3:
Essayez-le en ligne
la source