numeros letras imprimir convertir concatenar python string python-3.x concatenation python-2.x

python - letras - ¿Cómo puedo concatenar objetos str e int?



imprimir variables en python (4)

El problema aquí es que el operador + tiene (al menos) dos significados diferentes en Python: para los tipos numéricos, significa "sumar los números":

>>> 1 + 2 3 >>> 3.4 + 5.6 9.0

... y para los tipos de secuencia, significa "concatenar las secuencias":

>>> [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] >>> ''abc'' + ''def'' ''abcdef''

Como regla, Python no convierte implícitamente objetos de un tipo a otro 1 para hacer que las operaciones "tengan sentido", porque eso sería confuso: por ejemplo, podrías pensar que ''3'' + 5 debería significar ''35'' , pero alguien más podría pensar que debería significar 8 o incluso ''8'' .

Del mismo modo, Python no le permitirá concatenar dos tipos diferentes de secuencia:

>>> [7, 8, 9] + ''ghi'' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "str") to list

Debido a esto, debe hacer la conversión explícitamente, ya sea que lo que quiere sea concatenación o adición:

>>> ''Total: '' + str(123) ''Total: 123'' >>> int(''456'') + 789 1245

Sin embargo, hay una mejor manera . Dependiendo de la versión de Python que utilice, existen tres tipos diferentes de formato de cadenas disponibles 2 , que no solo le permiten evitar operaciones múltiples + :

>>> things = 5

>>> ''You have %d things.'' % things # % interpolation ''You have 5 things.''

>>> ''You have {} things.''.format(things) # str.format() ''You have 5 things.''

>>> f''You have {things} things.'' # f-string (since Python 3.6) ''You have 5 things.''

... pero también le permite controlar cómo se muestran los valores:

>>> value = 5 >>> sq_root = value ** 0.5 >>> sq_root 2.23606797749979

>>> ''The square root of %d is %.2f (roughly).'' % (value, sq_root) ''The square root of 5 is 2.24 (roughly).''

>>> ''The square root of {v} is {sr:.2f} (roughly).''.format(v=value, sr=sq_root) ''The square root of 5 is 2.24 (roughly).''

>>> f''The square root of {value} is {sq_root:.2f} (roughly).'' ''The square root of 5 is 2.24 (roughly).''

Ya sea que use % interpolation , str.format() , o f-strings depende de usted:% de interpolación ha sido por más tiempo (y es familiar para las personas con un fondo en C), str.format() es a menudo más poderoso , y f-strings son aún más potentes (pero están disponibles solo en Python 3.6 y versiones posteriores).

Otra alternativa es utilizar el hecho de que si le da a print múltiples argumentos posicionales, unirá sus representaciones de cadena junto usando el argumento de palabra clave sep (que por defecto es '' '' ):

>>> things = 5 >>> print(''you have'', things, ''things.'') you have 5 things. >>> print(''you have'', things, ''things.'', sep='' ... '') you have ... 5 ... things.

... pero eso no suele ser tan flexible como usar las habilidades de formateo de cadenas integradas de Python.

1 Aunque hace una excepción para los tipos numéricos, donde la mayoría de la gente estaría de acuerdo con lo "correcto" que hacer:

>>> 1 + 2.3 3.3 >>> 4.5 + (5.6+7j) (10.1+7j)

2 En realidad cuatro ... pero las cadenas de plantillas rara vez se usan y son un tanto incómodas.

Si trato de hacer lo siguiente:

things = 5 print("You have " + things + " things.")

Me sale el siguiente error en Python 3.x:

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not int

... y un error similar en Python 2.x:

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate ''str'' and ''int'' objects

¿Cómo puedo evitar este problema?


Una de las formas más simples de evitar este problema (esta era la pregunta, ¿no?) Es acostumbrarse a concatenar cualquier tipo de objeto a una cadena usando una coma ('','') como operador de concatenación . Esto funciona bien con print () y si esto no es lo suficientemente perfecto (para evitar los espacios en las inserciones de print () ''puntos de costura) simplemente use la función'' myprint () ''proporcionada a continuación. Otra herramienta útil sería la función "concatByComma ()" que devuelve una cadena apropiada.

Simplemente ejecuta el siguiente código y diviértete :)

def myprint(*arg): strToPrint = "" for item in arg: strToPrint += str(item) print(strToPrint) def concatByComma(*arg): strToPrint = "" for item in arg: strToPrint += str(item) return strToPrint I = "I"; i=5 print(I, " am " , i , " years old") print((''s'',''o'', I),['' wrote'',''it:''],'' '',{1:''hour''},''and'',5," min.") myprint((''s'',''o'', I),['' wrote'',''it:''],'' '',{1:''hour''},''and'',5," min.")


Python 2.x

  1. ''You have %d things.'' % things ''You have %d things.'' % things [ 1 ]
  2. ''You have {} things.''.format(things) [ 2 ]

Python 3.6+

  1. ''You have %d things.'' % things ''You have %d things.'' % things [ 1 ]
  2. ''You have {} things.''.format(things) [ 2 ]
  3. f''You have {things} things.'' [ f-strings ]

Referencia

  1. Formato de cadena de estilo printf
  2. 2
  3. f-strings

TL; DR

  1. o bien: print("You have " + str(things) + " things.") (la forma de la vieja escuela)

  2. o: print("You have {} things.".format(things)) (la nueva forma piadosa y recomendada)

Una explicación un poco más verbal:
Aunque hay algo que no está cubierto por la excelente respuesta de @Zero Piraeus anterior, trataré de "minificarlo" un poco :
No se puede concatenar una cadena y un número (de ningún tipo) en python porque esos objetos tienen diferentes definiciones del operador más (+) que no son compatibles entre sí (en el caso str + se usa para la concatenación, en el número de caso se usa para sumar dos números). Entonces, para resolver este "malentendido" entre los objetos:

  1. La forma de la vieja escuela es convertir el número a cadena con el método str(anything) y luego concatenar el resultado con otra cadena.
  2. La manera más pythonic y recomendada es utilizar el método de format que es muy versátil (no tienes que decir mi palabra, leer la documentación y this artículo)

¡Diviértete y lee la respuesta de @Zero Piraeus sin duda merece la pena!