Python TypeError:在字符串格式化过程中并非所有参数都已转换

Python TypeError:在字符串格式化过程中并非所有参数都已转换,python,string,python-3.x,typeerror,output-formatting,Python,String,Python 3.x,Typeerror,Output Formatting,程序应该接受两个名称,如果它们的长度相同,它应该检查它们是否是相同的单词。如果是同一个单词,它将打印“名称相同”。如果它们长度相同但字母不同,则会打印“名称不同但长度相同”。我遇到问题的部分在最后4行 #!/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: ")

程序应该接受两个名称,如果它们的长度相同,它应该检查它们是否是相同的单词。如果是同一个单词,它将打印“名称相同”。如果它们长度相同但字母不同,则会打印“名称不同但长度相同”。我遇到问题的部分在最后4行

#!/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)
#/usr/bin/env python
#在此处输入“姓名(长度)是多少?”的代码。
名称1=输入(“输入名称1:”)
名称2=输入(“输入名称2:”)
莱恩(姓名1)
莱恩(姓名2)
如果len(name1)=len(name2):
如果name1==name2:
打印(“名称相同”)
其他:
打印(“名称不同,但长度相同”)
如果len(名称1)>len(名称2):
打印(“{0}”比“{1}”长%name1,name2)
elif len(名称1)
当我运行此代码时,它显示:

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
回溯(最近一次呼叫最后一次):
文件“program.py”,第13行,在
打印(“{0}”比“{1}”长%name1,name2)
TypeError:在字符串格式化过程中并非所有参数都已转换

非常感谢您的建议。

您正在混合不同的格式函数

旧式
%
格式使用
%
代码进行格式设置:

'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文档:):

但是,“%”运算符无效。新的做事方式是这样的:

"'{0}' is longer than '{1}'".format(name1, name2)

除了另外两个答案之外,我认为在最后两个条件中,缩进也是不正确的。 条件是一个名称比另一个长,并且它们需要以“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))

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

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

>>> thetuple = (1, 2, 3)
>>> print "this is a tuple: %s" % (thetuple,)
this is a tuple: (1, 2, 3)
将感兴趣的元组作为唯一项生成单元组, i、 (双倍)部分是这里的关键部分


在我的例子中,这是因为我只需要一个
%s
,我缺少值输入。

我也遇到了错误

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 
但是列表args工作得很好


我使用mysqlclient python库。该库似乎不接受元组参数。要通过列表arg,例如
['arg1','arg2']
将起作用。

正如其他一些答案中所指出的,存在一系列问题

  • 正如nneonneo所指出的,您混合了不同的字符串格式化方法
  • 正如盖普所指出的,你的缩进也被去掉了
  • 我提供了.format的示例以及将元组传递给%s的参数说明符。在这两种情况下,缩进都是固定的,因此大于/小于检查超出了长度匹配的范围。还将随后的if语句更改为elif语句,以便它们仅在前面的同一级别语句为False时运行

    使用.format设置字符串格式
    name1=输入(“输入名称1:”)
    名称2=输入(“输入名称2:”)
    莱恩(姓名1)
    莱恩(姓名2)
    如果len(name1)=len(name2):
    如果name1==name2:
    打印(“名称相同”)
    其他:
    打印(“名称不同,但长度相同”)
    elif len(名称1)>len(名称2):
    打印({0}比{1}长)。格式(name1,name2))
    elif len(名称1)
    使用%s和元组设置字符串格式
    name1=输入(“输入名称1:”)
    名称2=输入(“输入名称2:”)
    莱恩(姓名1)
    莱恩(姓名2)
    如果len(name1)=len(name2):
    如果name1==name2:
    打印(“名称相同”)
    其他:
    打印(“名称不同,但长度相同”)
    elif len(名称1)>len(名称2):
    打印(“%s”长于“%s”%(名称1,名称2))
    elif len(名称1)
    视图中的django原始sql查询

    "SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)
    
    models.py

    views.py

    注意:使用Python3.5和django 1.11


    在Python3.7及更高版本中,有一种新的简单方法。以下是语法:

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

    Hello, Eric. You are 74.
    

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

    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
    

    scnr:“将来可能会被弃用”到目前为止还没有发生(Python 3.5)。旧的“%”语法在中没有被弃用,仅在3.2中被弃用。突然,3.5带来了。这让我觉得
    %
    将在很长一段时间内保留。
    %
    更简洁。很高兴它一直伴随着我们。我同意更简洁,删除不会给语言带来任何好处。@LenarHoyt您觉得f字符串怎么样?我无法想象这是
    “'%s'比'%s'”(name1,name2)
    f更简洁“{name1}”比{name2}”长
    我完全支持f-string,但它们太新了,不能在一年以上的项目中使用它们。我宁愿使用以下语句之一将元组转换为字符串:
    print(“这是一个元组:%s”
    
    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