2011-07-23 19 views
9

Soy nuevo en Python y necesito ayuda para comprender dos problemas que tengo relacionados con la concatenación de cadenas. Soy consciente de que se pueden agregar cadenas para concatenar entre sí usando el símbolo + como tal.Concatenación de cadenas de Python - concatenante ' n'

>>> 'a' + 'b' 
'ab' 

Sin embargo, sólo recientemente descubrí que ni siquiera es necesario utilizar el símbolo + para concatenar cadenas (por accidente/jugueteando), que lleva a mi primer problema de entender - ¿Cómo/por qué es esto posible !

>>> print 'a' + 'b' 
ab 

Además, también entiendo que la cadena '\ n' produce una 'nueva línea'. Pero cuando se usa junto con mi primer problema. Obtengo lo siguiente.

>>> print '\n' 'a'*7 

a 
a 
a 
a 
a 
a 
a 

Así surge mi segundo problema - "¿Por qué recibo 7 nuevas líneas de la letra 'a' En otras palabras, no debe el repetidor de símbolos, *, repetir la letra 'a' 7 veces.! ? en la siguiente manera

>>> print 'a'*7 
aaaaaaa 

por favor, ayúdame a aclarar lo que está pasando

+4

'print '\ n' 'a' *' 7' productos '\ na' * 7', no 'a a a a a a a' –

+0

Eso es sólo un error de formato en su puesto. – agf

Respuesta

2

Python concatena cadenas juntos cuando no los separan con una coma:..

>>> print 'a' 'b' 
ab 

>>> print 'a', 'b' 
a b 

Así que en realidad está imprimiendo '\na' 7 veces.

+0

Él sabe que las cadenas se concatenan de esa manera, lea el resto de su publicación. – agf

17

Cuando "a" "b" se convierte en "ab", esto no es lo mismo que concatenar las cadenas con +. Cuando se lee el código fuente de Python, las cadenas adyacentes se unen automáticamente para mayor comodidad.

Esto no es una operación normal, por lo que no está siguiendo el orden de las operaciones que espera para + y + y *.

print '\n' 'a'*7 

es en realidad interpretarse lo mismo que

print '\na'*7 

y no como

print '\n' + 'a'*7 
1
  1. No estoy seguro de lo que quiere decir con "¿cómo es posible" . Usted escribe una regla: dos cadenas una al lado de la otra se concatenan. Luego lo implementas en el analizador. ¿Por qué? Ya que le hace muy bien hacer cosas como esta:

    re.findall('(<?=(foo))' # The first part of a complicated regexp 
          '>asdas s'  # The next part 
          '[^asd]'  # The last part 
         ) 
    

    De esta manera, se puede describir exactamente lo que está haciendo.

  2. Cuando haces A * B + C, la computadora siempre hace A veces B primero, luego agrega C, porque la multiplicación viene antes de la suma.

    Cuando realiza la concatenación de cadenas colocando los literales de cadena uno al lado del otro y la multiplicación, la concatenación de cadenas especial es lo primero. Esto significa que '\n' 'a' * 7 es lo mismo que ('\n' 'a') * 7, por lo que la cadena que está repitiendo es '\na'.

1

Probablemente ya se ha dado cuenta de que depender de la concatenación implícita de cadenas adyacentes a veces es problemático. Además, la concatenación con el operador + no es eficiente. No se nota si se unen solo unas pocas cadenas pequeñas, pero es muy notable a escala.

Sea explícito al respecto; utilizar ''.join()

print '\n'.join(['a'*7]) 
+0

Es bastante lento hacer un ciclo en muchas cadenas cortas porque tiene que obtener el método '\ n'.join() cada vez, siempre intente mantenerlo fuera del ciclo, o use map (str.join, sequence)) en cambio. – agf

+0

Er sí, hay optimizaciones que se pueden hacer dependiendo del contexto. OP no mencionó bucles sin embargo. –

Cuestiones relacionadas