2010-01-09 20 views
8
var1 = 'abc' 
var2 = 'xyz' 

print('literal' + var1 + var2) # literalabcxyz 
print('literal', var1, var2) # literal abc xyz 

... excepto los espacios automáticos con ',' ¿cuál es la diferencia entre los dos? ¿Qué usar normalmente, también cuál es el más rápido?Operador de concatenación + o,

Gracias

Respuesta

21

(Estás usando Python 3.x, donde la impresión es una función — en 2.x, la impresión es una declaración. Es una buena idea mencionar la versión principal de Python 2.x — o 3. x — especialmente cuando se pide ayuda, porque en la actualidad la mayoría de las personas asumen razonablemente 2.x a menos que sea indicado.)

La primera, print('literal' + var1 + var2), evalúa una expresión y pasa un solo argumento para imprimir. El segundo, print('literal', var1, var2), acaba de pasar tres argumentos para imprimir. Este es casi el mismo resultado por pura casualidad: así es como funciona la impresión. El segundo no está haciendo ninguna concatenación, y simplemente está produciendo cada valor separado por un espacio (que es el comportamiento predeterminado de impresión).

ser explícitos: el signo más en la expresión es haciendo concatenación, pero la coma no es haciendo concatenación.


Tiempo: Me dieron los resultados siguientes; sin embargo, creo que esto es parcial porque las cadenas son muy cortas (por ejemplo, cadenas más largas podrían revertir el resultado) y, en cualquier caso, la impresión como presentación en la pregunta no llevará mucho tiempo (obtendrá un mejor rendimiento preocupándose por muchos otras cosas en su lugar).

Nota: Utilice python -m timeit --help para obtener instrucciones sobre cómo usar timeit.

$ python -m timeit -s 'from cStringIO import StringIO; out = StringIO(); a = "abc"; b = "def"' 'print >>out, a, b' 
100000 loops, best of 3: 7.68 usec per loop 
$ python -m timeit -s 'from cStringIO import StringIO; out = StringIO(); a = "abc"; b = "def"' 'print >>out, a + " " + b' 
100000 loops, best of 3: 4.67 usec per loop 
$ python -m timeit -s 'from cStringIO import StringIO; out = StringIO(); a = "abc"; b = "def"' 'print >>out, " ".join([a, b])' 
100000 loops, best of 3: 5.37 usec per loop 

En particular, observe cada código dará el mismo resultado exacto (no tiene sentido comparar si un método da los resultados incorrectos). El StringIO es una forma fácil de no imprimir en la pantalla en estas pruebas, pero podría estar afectando los resultados también.

+0

que es el más rápido entre los dos? – 3zzy

+0

Hacen cosas diferentes, no se puede comparar razonablemente con la velocidad. Dicho esto, puede comparar * imprimiendo * las dos formas diferentes, use el módulo timeit. –

+1

Tenga en cuenta que para las temporizaciones anteriores, cStringIO casi con seguridad funcionará de forma diferente que escribir en la consola, y al escribir en la consola el rendimiento puede diferir según la plataforma en la que se encuentre y el tamaño de las cadenas con las que se trate. –

1

Al utilizar una coma da los múltiples argumentos de la función de impresión (que en este caso se imprimen todos, separadas por un espacio. Usando el plus creará un argumento para la impresión, que se imprime en su totalidad. Creo que con las teclas + es el mejor en este caso.

5

cadenas pasar como argumentos de impresión se une a ellos con la palabra clave 'SEP'. por defecto es '' (espacio).

palabra clave Separador sólo Python 3.x Antes, el separador siempre es un espacio, excepto en 2.5 (?) Y arriba donde puede from __future__ import print_function o algo así.

>>> print('one', 'two') # default ' ' 
one two 
>>> print('one', 'two', sep=' and a ') 
one and a two 
>>> ' '.join(['one', 'two']) 
one two 
>>> print('one' + 'two') 
onetwo 
+1

¿cuál es el más rápido entre los dos? – 3zzy