TypeError:不是所有在字符串格式化python时转换的参数

程序应该接受两个名字,如果它们的长度相同,它应该检查它们是否是同一个单词。如果是同一个单词,它将打印名字是一样的;。如果长度相同但字母不同,则输出名字不同,但长度相同;。我有一个问题的部分是在底部的四行。

#!/usr/bin/env python
# Enter your code for "What's 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
844286 次浏览

你混合了不同的格式函数。

旧式的%格式化使用%代码进行格式化:

'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)

错误出现在字符串格式中。

使用'%'操作符使用传统字符串格式化的正确方法是使用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)

除了其他两个答案,我认为最后两个条件的缩进也是不正确的。 条件是一个名称比另一个名称长,它们需要以'elif'开头,并且没有缩进。如果您将它置于第一个条件中(通过从边缘处给它四个缩进),它最终会是矛盾的,因为名称的长度不能同时相等和不同。< / p >

    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))

对我来说,这个错误是在我试图将一个元组传递到字符串格式方法时引起的。

我从这个问题/答案中找到了答案

从链接(不是我的作品)复制并粘贴正确答案:

>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)

用感兴趣的元组作为唯一项创建一个单元组, 例如,(thetuple,)部分是这里的关键位

我也会遇到错误,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting

但是列表参数工作得很好。

我使用mysqlclient python lib。lib看起来不接受元组参数。传递像['arg1', 'arg2']这样的列表参数将有效。

在python 3.7及以上版本中,有一种新的简单方法。它叫做f弦。语法如下:

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

输出:

Hello, Eric. You are 74.

对于我来说,由于要在一次打印调用中存储许多值,解决方案是创建一个单独的变量来将数据存储为元组,然后调用打印函数。

x = (f"{id}", f"{name}", f"{age}")
print(x)

最简单的方法将字符串数字类型转换为整数

number=89
number=int(89)

请记住,这个错误也可能是由于忘记引用变量引起的

"this is a comment" % comment #ERROR

而不是

"this is a comment: %s" % comment