Concatenación de cadenas sin operador ‘+’

Estaba jugando con python y me di cuenta de que no necesitamos usar el operador ‘+’ para concatenar cadenas a menos que se use directamente.

Por ejemplo:

string1 = 'Hello' 'World' #1 works fine string2 = 'Hello' + 'World' #2 also works fine string3 = 'Hello' string4 = 'World' string5 = string3 string4 #3 causes syntax error string6 = string3 + string4 #4 works fine 

Ahora tengo dos preguntas:

  1. ¿Por qué la statement 3 no funciona mientras que la statement 1 sí funciona?
  2. ¿Hay alguna diferencia técnica, como la velocidad de cálculo, etc. entre la statement 1 y 2?

De los documentos :

Se permiten múltiples literales de cadena adyacentes (delimitados por espacios en blanco), posiblemente utilizando diferentes convenciones de comillas, y su significado es el mismo que su concatenación. Por lo tanto, “hola” ‘mundo’ es equivalente a “helloworld”.


La statement 3 no funciona porque:

El operador ‘+’ debe utilizarse para concatenar expresiones de cadena en tiempo de ejecución.

Observe que el título del subtítulo en los documentos es “concatenación literal de cadena” también. Esto solo funciona para cadenas literales, no para otros objetos.


Probablemente no haya diferencia. Si lo hay, probablemente sea extremadamente pequeño y nada de lo que alguien deba preocuparse.


Además, entiende que puede haber peligros para esto:

 >>> def foo(bar, baz=None): ... return bar ... >>> foo("bob" ... "bill") 'bobbill' 

Este es un ejemplo perfecto de donde los errores nunca deben pasar en silencio. ¿Y si quisiera que "bill" fuera el argumento baz ? He olvidado una coma, pero no se produce ningún error. En cambio, la concatenación ha tenido lugar.

Para responder a su segunda pregunta: No hay ninguna diferencia (al menos con la implementación que uso). Desmontando ambas declaraciones, se representan como LOAD_CONST STORE_FAST . Son equivalentes.

Puede usar %s ya que es más eficiente que usar el signo +.

 >>> string2 = "%s %s" %('Hello', 'World') >>> string2 'Hello World' 

(O)


Un método más es .format

 >>> string2 = "{0} {1}".format("Hello", "World") >>> string2 'Hello World' >>> 

Esto es una concatenación literal de cadena implícita. Solo ocurre con los literales de cadena, no con variables u otras expresiones que se evalúan como cadenas. Solía ​​haber una (pequeña) diferencia de rendimiento, pero en estos días, el optimizador de mirilla debería hacer que los formularios sean esencialmente equivalentes.

La statement 3 no funciona, ya que cuando concatena dos expresiones de cadena para crear una cadena nueva, se necesita un operador ‘+’.

mientras que en el caso de la picadura 1, 2 y 4, los literales adyacentes separados por espacios en blanco utilizan diferentes convenciones de citación. Por lo tanto, se les permite imprimirlos igual que su concatenación.

además, no habrá ninguna diferencia de tiempo significativa o notable en la ejecución de esas 2 operaciones.

 %%timeit -n 1 s1='ab' s2='ba' print(s1+s2) 

o / p La carrera más lenta tomó 17.08 veces más que la más rápida. Esto podría significar que se está almacenando en caché un resultado intermedio. 57.8 µs ± 92.5 µs por bucle (media ± desviación estándar de 7 ejecuciones, 1 bucle cada una)

 %%timeit -n 1 s3='ab' 'ba' print(s3) 

o / p La carrera más lenta demoró 4.86 veces más que la más rápida. Esto podría significar que se está almacenando en caché un resultado intermedio. 25.7 µs ± 21 µs por bucle (media ± desviación estándar de 7 carreras, 1 bucle cada una)

¿Por qué la statement 3 no funciona mientras que la statement 1 sí funciona?

Porque, en la primera statement, estamos asignando alguna constante a una variable. La asignación de variables es lo suficientemente simple como para que podamos seguir poniendo varias constantes en una sola variable y la asignación aún se realizará. Los términos "hello" y "world" son dos constantes del mismo tipo. Por lo tanto, la statement funcionó.

Si hacemos lo siguiente, obtendremos SyntaxError

 string1 = "Hello" 1 

El motivo es que proporcionamos varias constantes en una sola asignación de variable. Esto confundió a Python y lo arrojó como un error.

La statement 3 tiene que ver con asignar una variable basada en dos variables. Esto producirá SyntaxError ya que Python no sabe qué puede hacer con 2 variables antes de asignarlo a la variable.

¿Hay alguna diferencia técnica, como la velocidad de cálculo, etc. entre la statement 1 y 2?

Sí. La única diferencia técnica es la legibilidad en lugar de cualquier otra cosa. La legibilidad es lo más importante en Python. Para un ojo no entrenado, "hello" "world" puede parecer que el comstackdor agregaría espacio a las cadenas. Que no es el caso.

Sin embargo,

 "hello" + "world" 

Es explícito y normal. Casi siempre, Explicit es mejor que implícito.