En Python, uno puede guardar bytes aliasing funciones que se utilizan repetidamente. Por ejemplo:
r=range
a=r(100)
b=r(200)
c=r(300)
Sin embargo, cuando las funciones son funciones miembro juntas, no sé cómo asignar un alias de una manera que permita el encadenamiento. Por ejemplo:
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')
Obviamente, lo que estoy tratando de hacer no es válido. Y tampoco es esto:
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')
¿Hay alguna otra forma de alias de funciones miembro y funciones encadenadas que guarde caracteres?
q
significa lo quereplace
significa en la clase que está utilizando.q
está vinculado al método de reemplazo de esastr
instancia específica . Además, recuerde que puede hacer reemplazos de caracteres individuales con"Hello".replace(*"HJ")
Respuestas:
¡No hay problema! Puede usar un alias para un método, pero debe saber cómo usarlo:
La clave es que debe pasar
self
explícitamente, porque el alias es un tipo de función que toma un argumento adicional que tomaself
:fuente
Defina su propia clase, con un nombre de método más corto.
Por ejemplo, si está utilizando el método que
replace()
pertenece a laString
clase, podría hacer que su propia claseS
tenga un método llamadoq
que haga lo mismo.Aquí hay una implementación:
Aquí hay una implementación mucho mejor:
Úselo así:
fuente
Esto es unos caracteres más cortos de todos modos
incluso más corto para un pequeño número de reemplazos es
Por supuesto, esto solo cubre un caso particular. Sin embargo, el código de golf se trata de encontrar esos casos especiales que pueden ahorrarle bytes.
Es posible escribir una función de contenedor que maneje el caso general, pero el código será demasiado grande para tener un lugar en la mayoría de los desafíos de golf de código.
En cambio, debe pensar "Puedo hacer esta transformación de manera eficiente (trazo) con str.replace. ¿Puedo cambiar la representación interna de mi solución para aprovechar eso? (Sin desperdiciar tantos trazos para negar la ventaja)"
fuente
Puedes usar la
reduce
función.fuente
Si está haciendo muchos reemplazos, podría hacer esto:
fuente
[a]
)[a]
tiene que ser reemplazado por.get(a,a)
(de lo contrario, obtenemos algo de error clave)? ¿Y por qué tener enlist(s)
lugar des
?¿Qué hay de definir una función lambda?
fuente
str.replace
/ is / that lambda! Mira mi respuesta.Si no es necesario encadenar sus reemplazos, puede usar `str.translate '. Los números son los ordinales ASCII. Usarlo de esta manera requiere Python 3:
Pruébalo en línea
fuente