¿Por qué es% s mejor que + para la concatenación?

82

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 otra cosa que no sea + ? Es más rápido escribir concatenación con un simple + . Luego, si observa la cadena de formato, especifique los tipos, por ejemplo, %s y %d y tal. Entiendo que podría ser mejor ser explícito sobre el tipo.

Pero luego leí que el uso de + para la concatenación debería evitarse aunque sea más fácil de escribir. ¿Existe una razón clara por la que las cadenas se deben concatenar de alguna otra forma?

    
pregunta Niklas Rosencrantz 07.12.2015 - 11:33

5 respuestas

76
  1. 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 sintaxis de %s forzará automáticamente cualquier tipo que no sea str a str ; mientras que la concatenación solo funciona con str , y no puedes concatenar str con int .

  2. Rendimiento. En Python, str es inmutable, por lo que las cadenas izquierda y derecha deben copiarse en la nueva cadena para cada par de concatenaciones. 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 se ponen cada vez peor a medida que aumenta el número y el tamaño de la cadena. Java optimiza este caso algunas de las veces mediante la transformación de la serie de concatenación para usar StringBuilder , pero CPython no.

  3. Para algunos casos de uso, la biblioteca de registro proporciona una API que usa una cadena de formato para crear la cadena de entrada de registro perezosamente ( logging.info("blah: %s", 4) ). Esto es excelente para mejorar el rendimiento si la biblioteca de registro decidió que la entrada del registro actual se descartará por un filtro de registro, por lo que no es necesario formatear la cadena.

respondido por el Lie Ryan 07.12.2015 - 12:11
45

¿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 lo que es el verbo.

¿Cuál de estos es más claro a simple vista?

"your %s is in the %s" % (object, location)

o

"your " + object + " is in the " + location  
    
respondido por el Mawg 09.12.2015 - 16:49
10

Un ejemplo que clarifica el argumento de la legibilidad:

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)

(Tenga en cuenta que el segundo ejemplo no solo es más legible sino también más fácil de editar, puede cambiar la plantilla en una línea y la lista de variables en otra)

Un problema aparte es que el código% s también se convierte a la cadena, de lo contrario, tiene que usar la llamada a str () que también es menos legible que el código% s.

    
respondido por el Rainy 08.12.2015 - 18:16
5

El uso de + no debería evitar 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 el 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:

print "Hello %s, welcome to the computer!" % name

En este caso, utilizando %s es más legible ya que evita cortar la primera cadena en varios segmentos. Especialmente si estás interpolando múltiples valores.

.join() es apropiado si tiene una secuencia de tamaño variable de cadenas y / o si desea concatenar varias cadenas con el mismo separador.

    
respondido por el JacquesB 09.12.2015 - 08:56
2

Dado que el orden de las palabras puede cambiar en diferentes idiomas, el formulario con %s es imperativo si desea respaldar adecuadamente la traducción de cadenas en su software.

    
respondido por el martjno 15.12.2017 - 08:53

Lea otras preguntas en las etiquetas