usuario2652300
Tengo un código que leerá dos cadenas del usuario:
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
Más tarde, quiero formatear esas cadenas en una cadena más larga para imprimir:
if len(name1) > len(name2):
print ("'{0}' is longer than '{1}'"% name1, name2)
Pero recibo un mensaje de error que se ve así:
Traceback (most recent call last):
File "program.py", line 13, in <module>
print ("'{0}' is longer than '{1}'"% name1, name2)
TypeError: not all arguments converted during string formatting
¿Qué está mal con el código? ¿Cómo debo escribir esta línea en su lugar para formatear la cadena correctamente?
Consulte también Formato de cadena: % frente a .formato frente a f-string literal para una comparación detallada de las formas más comunes de hacer este tipo de formato de cadena y ¿Cómo coloco el valor de una variable dentro de una cadena (interpolarlo en el cadena)? para obtener una guía práctica general para este tipo de construcción de cuerdas. Consulte Imprimir tupla con formato de cadena en Python para conocer otra causa común del error.
neoneo
Viejo estilo %
usos de formato %
códigos para formatear:
# A single value can be written as is:
'It will cost $%d dollars.' % 95
# Multiple values must be provided as a tuple:
"'%s' is longer than '%s'" % (name1, name2)
Nuevo estilo {}
usos de formato {}
códigos y el .format
método. Asegúrese de no mezclar y combinar, si la cadena “plantilla” contiene {}
marcadores de posición, luego llame .format
no usar %
.
# The values to format are now arguments for a method call,
# so the syntax is the same either way:
'It will cost ${0} dollars.'.format(95)
"'{0}' is longer than '{1}'".format(name1, name2)
-
en pitón 3.6:
f"'It will cost ${your_variable} dollars."
– JinSnow
22 de marzo de 2017 a las 20:18
-
complemento del comentario de @JinSnow… si desea que también se imprima el nombre de la variable,
f"'It will cost {your_variable=} dollars."
– SamDaniel
9 de noviembre de 2021 a las 9:56
leonh
La forma correcta de usar el formato de cadena tradicional usando el operador ‘%’ es usar una cadena de formato de estilo printf (documentación de Python para esto aquí: http://docs.python.org/2/library/string.html#format-string-syntax):
"'%s' is longer than '%s'" % (name1, name2)
Sin embargo, el operador ‘%’ probablemente quedará obsoleto en el futuro. El nuevo PEP 3101 forma de hacer las cosas es así:
"'{0}' is longer than '{1}'".format(name1, name2)
-
scnr: “probablemente quedará obsoleto en el futuro” no sucedió hasta ahora (Python 3.5). La antigua sintaxis ‘%’ no quedó obsoleta en 3.1 y solo en 3.2 módulo de registro aprendió cómo formatear con el nuevo estilo
{}
. Y de repente trae 3.5 PEP 461:%
formato de bytes. Esto me hace pensar que%
queda por mucho tiempo por venir.– cfi
7 de enero de 2016 a las 16:03
-
%
es más conciso. Me alegro de que se quede con nosotros.– Lenar Hoyt
10 de junio de 2016 a las 10:36
-
Estoy de acuerdo. % es más conciso y eliminarlo no agregaría ningún beneficio al lenguaje.
– perro de caza
26 de diciembre de 2017 a las 16:13
-
@LenarHoyt ¿Cómo te sientes acerca de las cuerdas f? no puedo imaginar que eso sea
"'%s' is longer than '%s'" % (name1, name2)
más conciso quef"'{name1}' is longer than '{name2}'"
–Mark Moretto
16 de enero de 2020 a las 12:34
-
Estoy totalmente a favor de las cuerdas f, pero son demasiado nuevas y no puedes usarlas en un proyecto que tenga más de un año.
– Darko Kolev
29 de septiembre de 2020 a las 11:27
nick brady
Este error también se produce cuando se intenta formatear un solo valor en la cadena usando %
si el valor es una tupla.
Como se muestra y explica en la respuesta de Alex Martelli allí:
>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)
Hacer una tupla singleton con la tupla de interés como único elemento, es decir, el
(thetuple,)
parte, es la parte clave aquí.
-
Preferiría convertir la tupla en una cadena usando una de las siguientes declaraciones:
print("this is a tuple: %s" % str(thetuple))
oprint("this is a tuple: %s" % repr(thetuple))
– Alex
7 de marzo de 2017 a las 6:56
Tenga en cuenta que este error también podría deberse a que se olvidó de hacer referencia a la variable
"this is a comment" % comment #ERROR
en lugar de
"this is a comment: %s" % comment
Tahir Musharraf
En python 3.7 y superior, hay una forma nueva y fácil. Se llama cuerdas f. Aquí está la sintaxis:
name = "Eric"
age = 74
f"Hello, {name}. You are {age}."
Producción:
Hello, Eric. You are 74.
-
Esto en realidad no responde la pregunta.
– pimienta
27 de junio de 2022 a las 18:29
Azro
Para mí, como estaba almacenando muchos valores dentro de una sola llamada de impresión, la solución fue crear una variable separada para almacenar los datos como una tupla y luego llamar a la función de impresión.
x = (f"{id}", f"{name}", f"{age}")
print(x)
-
Esto en realidad no responde la pregunta.
– pimienta
27 de junio de 2022 a las 18:29
sameer_nubia
La forma más fácil de encasillar el número de cadena a entero
number=89
number=int(89)
-
Esto se refiere a un problema no relacionado. Consulte, por ejemplo, stackoverflow.com/questions/15496408.
– Karl Knechtel
4 abr a las 0:39