Entiendo que deberíamos usar %s
para concatenar una cadena en lugar de +
en Python.
Podría hacer cualquiera de:
hello = "hello"
world = "world"
print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])
Pero, ¿por qué debería usar algo más que el +
? Es más rápido escribir concatenación con un simple +
. Luego, si observa la cadena de formato, especifique los tipos, por ejemplo, %s
and %d
y such. Entiendo que podría ser mejor ser explícito sobre el tipo.
Pero luego leí que el uso +
para la concatenación debe evitarse aunque sea más fácil de escribir. ¿Existe una razón clara por la que las cadenas deben concatenarse de alguna de esas otras formas?
%s
no es para concatenación, es una especificación de conversión para el formato de cadenas derivado de C'sprintf(3)
. Hay casos para usar eso o un operador de concatenación; que utilices debe basarse en el juicio de la situación, no en el dogma. Lo fácil que es escribir el código es completamente irrelevante porque solo lo vas a hacer una vez.print(f"{hello} {world}")
, tiene legibilidad de concatenación ya que las variables se ven donde ocurren en la cadena y es más rápido questr.format
.Respuestas:
Legibilidad. La sintaxis de la cadena de formato es más legible, ya que separa el estilo de los datos. Además, en Python, la
%s
sintaxis coaccionará automáticamente cualquierstr
tipo que no seastr
; mientras que la concatenación solo funcionastr
y no se puede concatenarstr
conint
.Actuación. En Python
str
es inmutable, por lo que las cadenas izquierda y derecha deben copiarse en la nueva cadena para cada par de concatenación. Si concatena cuatro cadenas de longitud 10, estará copiando (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 caracteres, en lugar de solo 40 caracteres. Y las cosas empeoran cuadráticamente a medida que aumenta el número y el tamaño de la cadena. Java optimiza este caso algunas veces transformando la serie de concatenación para usarStringBuilder
, pero CPython no.Para algunos casos de uso, la biblioteca de registro proporciona una API que utiliza la cadena de formato para crear la cadena de entrada de registro de forma perezosa (
logging.info("blah: %s", 4)
). Esto es excelente para mejorar el rendimiento si la biblioteca de registro decidió que la entrada de registro actual será descartada por un filtro de registro, por lo que no necesita formatear la cadena.fuente
¿Soy el único que lee de izquierda a derecha?
Para mí, usar
%s
es como escuchar a hablantes de alemán, donde tengo que esperar hasta el final de una oración muy larga para escuchar cuál es el verbo.¿Cuál de estos es más claro a simple vista?
o
fuente
n
décadas, mi mente también funciona así ;-) Pero aún mantengo mi respuesta, la segunda es más clara y fácil de leer, por lo tanto, mantener. Y eso se hace más evidente cuanto más parámetros tenga. Al final, si es un espectáculo de un solo hombre, ve con lo que estás familiarizado y cómodo; si es un esfuerzo de equipo, imponga revisiones de consistencia y código; la gente puede acostumbrarse a cualquiera.f"your {object} is in the {location}"
."your '" + object + "' is in the '" + location + "'"
... Ni siquiera estoy seguro de haberlo entendido ahora mismo ...Un ejemplo que aclara el argumento de legibilidad:
(Tenga en cuenta que el segundo ejemplo no solo es más legible sino que también es más fácil de editar, puede cambiar la plantilla en una línea y la lista de variables en otra)
Otro problema es que el código% s también se convierte a la cadena, de lo contrario, debe usar la llamada str (), que también es menos legible que un código% s.
fuente
Usando
+
debería no ser evitado en general. En muchos casos es el enfoque correcto. Usar%s
o.join()
solo es preferible en casos particulares, y generalmente es bastante obvio cuando son la mejor solución.En su ejemplo, está concatenando tres cadenas juntas, y el ejemplo que usa
+
es claramente el más simple y más legible y, por lo tanto, el recomendado.%s
o.format()
son útiles si desea interpolar cadenas o valores en el medio de una cadena más grande. Ejemplo:En este caso, usarlo
%s
es más legible ya que evita cortar la primera cadena en múltiples segmentos. Especialmente si está interpolando múltiples valores..join()
es apropiado si tiene una secuencia de cadenas de tamaño variable y / o desea concatenar cadenas múltiples con el mismo separador.fuente
Dado que el orden de las palabras puede cambiar en diferentes idiomas, el formulario con
%s
es imprescindible si desea admitir correctamente la traducción de cadenas en su software.fuente