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
-
''You have %d things.'' % things
''You have %d things.'' % things
[ 1 ] -
''You have {} things.''.format(things)
[ 2 ]
Python 3.6+
-
''You have %d things.'' % things
''You have %d things.'' % things
[ 1 ] -
''You have {} things.''.format(things)
[ 2 ] -
f''You have {things} things.''
[ f-strings ]
Referencia
TL; DR
o bien:
print("You have " + str(things) + " things.")
(la forma de la vieja escuela)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:
- 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. - 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!