245

该程序应该接受两个名称,如果它们的长度相同,它应该检查它们是否是同一个单词。如果是同一个词,它将打印"The names are the same"。如果它们的长度相同但字母不同,它将打印"The names are different but the same length"。我遇到问题的部分在底部的 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)

当我运行此代码时,它显示:

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

任何建议都受到高度赞赏。

4

12 回答 12

257

您正在混合不同的格式功能。

旧式%格式化使用格式化%代码:

'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)
于 2013-08-05T08:19:49.410 回答
57

错误在于您的字符串格式。

使用 '%' 运算符使用传统字符串格式的正确方法是使用 printf 样式的格式字符串(此处的 Python 文档:http: //docs.python.org/2/library/string.html#format-字符串语法):

"'%s' is longer than '%s'" % (name1, name2)

但是,'%' 运算符将来可能会被弃用。新的PEP 3101做事方式是这样的:

"'{0}' is longer than '{1}'".format(name1, name2)
于 2013-08-05T08:31:19.037 回答
51

对我来说,当我尝试将元组传递给字符串格式方法时,会导致此错误。

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

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

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

用感兴趣的元组作为唯一项,即 (thetuple,) 部分,制作一个单例元组是这里的关键。

于 2016-05-03T22:14:49.903 回答
14

就我而言,这是因为我只需要一个%s, i 缺少值输入。

于 2017-10-10T07:43:29.320 回答
6

除了其他两个答案,我认为最后两个条件下的缩进也不正确。条件是一个名字比另一个名字长,他们需要以'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))
于 2013-11-26T07:27:27.743 回答
5

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

"this is a comment" % comment #ERROR

代替

"this is a comment: %s" % comment
于 2021-04-15T07:17:51.413 回答
5

在 python 3.7 及更高版本中,有一种新的简单方法。它被称为 f 弦。这是语法:

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

输出:

Hello, Eric. You are 74.
于 2019-10-23T13:02:44.473 回答
3

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

  1. 正如 nneonneo 所指出的,您正在混合使用不同的字符串格式化方法。
  2. 正如 GuyP 所指出的,您的缩进也已关闭。

我提供了 .format 的示例以及将元组传递给 %s 的参数说明符。在这两种情况下,缩进都已修复,因此大于/小于检查超出了长度匹配时的范围。还将后续 if 语句更改为 elif,因此它们仅在先前的同一级别语句为 False 时运行。

使用 .format 进行字符串格式化

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")
elif len(name1) > len(name2):
    print ("{0} is longer than {1}".format(name1, name2))
elif len(name1) < len(name2):
    print ("{0} is longer than {1}".format(name2, name1))

使用 %s 和元组进行字符串格式化

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")
elif len(name1) > len(name2):
    print ("%s is longer than %s" % (name1, name2))
elif len(name1) < len(name2):
    print ("%s is longer than %s" % (name2, name1))
于 2019-01-07T08:56:44.360 回答
1

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

number=89
number=int(89)
于 2020-08-01T14:03:27.847 回答
1

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

x = (f"{id}", f"{name}", f"{age}")
print(x) 
于 2019-12-13T14:50:10.143 回答
0

视图中的 django 原始 sql 查询

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

模型.py

class VehicleDamage(models.Model):
    requestdate = models.DateTimeField("requestdate")
    vendor_name = models.CharField("vendor_name", max_length=50)
    class Meta:
        managed=False

视图.py

def location_damageReports(request):
    #static date for testing
    date_from = '2019-11-01'
    date_to = '2019-21-01'
    vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to))
    damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True)
    data={"data": damage_report.data}
    return HttpResponse(json.dumps(data), content_type="application/json")

注意:使用 python 3.5 和 django 1.11

于 2019-02-26T07:48:35.347 回答
0

我也遇到错误,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

但是列表参数效果很好。

我使用 mysqlclient python lib。该库似乎不接受元组参数。传递 list args like['arg1', 'arg2'] 会起作用。

于 2018-02-19T13:29:20.550 回答