TypeError: не все аргументы, преобразованные во время форматирования строки python
Предполагается, что программа должна содержать два имени, и если они имеют одинаковую длину, она должна проверять, являются ли они одним и тем же словом. Если это одно и то же слово, оно напечатает "Имена одинаковы". Если они имеют одинаковую длину, но с разными буквами, она печатает "Имена разные, но одинаковые". Часть, с которой я столкнулась, находится в нижних 4 строках.
#!/usr/bin/env python
# Enter your code for "What In (The Length Of) A Name?" here.
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
if name1 == name2:
print ("The names are the same")
else:
print ("The names are different, but are the same length")
if len(name1) > len(name2):
print ("'{0}' is longer than '{1}'"% name1, name2)
elif len(name1) < len(name2):
print ("'{0}'is longer than '{1}'"% name2, name1)
Когда я запускаю этот код, он отображает:
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
Любые предложения приветствуются.
Ответы
Ответ 1
Вы смешиваете разные функции формата.
Форматирование %
в старом стиле использует %
коды для форматирования:
'It will cost $%d dollars.' % 95
В форматировании нового стиля {}
используются коды {}
и метод .format
'It will cost ${0} dollars.'.format(95)
Обратите внимание, что при форматировании в старом стиле вам нужно указать несколько аргументов с помощью кортежа:
'%d days and %d nights' % (40, 40)
В вашем случае, поскольку вы используете спецификаторы формата {}
, используйте .format
:
"'{0}' is longer than '{1}'".format(name1, name2)
Ответ 2
Ошибка в форматировании строк.
Правильный способ использования традиционного форматирования строк с использованием оператора "%" состоит в использовании строки формата стиля printf (документация Python для этого здесь: http://docs.python.org/2/library/string.html#format-string-syntax):
"'%s' is longer than '%s'" % (name1, name2)
Однако, оператор "%" вероятно, будет устаревшим в будущем. Новый способ PEP 3101 состоит в следующем:
"'{0}' is longer than '{1}'".format(name1, name2)
Ответ 3
Для меня эта ошибка была вызвана, когда я пытался передать кортеж в метод строкового формата.
Я нашел решение из этого вопроса/ответа
Копирование и вставка правильного ответа из ссылки (НЕ МОЯ РАБОТА):
>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)
Создание одноэлементного кортежа с кортежем интереса как единственного элемента, то есть часть (thetuple,), является ключевым битом здесь.
Ответ 4
В моем случае это потому, что мне нужен только один %s
, я пропускаю значения ввода.
Ответ 5
В дополнение к двум другим ответам, я думаю, что отступы также неверны в двух последних условиях.
Условия состоят в том, что одно имя длиннее другого, и им нужно начинать с "elif" и без отступов. Если вы положите его в первое условие (давая ему четыре отступов с поля), он окажется противоречивым, поскольку длины имен не могут быть одинаковыми и разными одновременно.
else:
print ("The names are different, but are the same length")
elif len(name1) > len(name2):
print ("{0} is longer than {1}".format(name1, name2))
Ответ 6
Я также сталкиваюсь с ошибкой,
_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting
Но список args работает хорошо.
Я использую mysqlclient python lib. Lib выглядит так, чтобы не принимать кортежи args. Чтобы передать список args, как ['arg1', 'arg2']
будет работать.
Ответ 7
IdkIdk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk Idk