iScrE4m 已经展示了如何修复你的程序,但我会解释你为什么会这样
TypeError: not all arguments converted during string formatting
错误信息。
当 Python 解释器看到%
一个字符串后,它将 解释%
为字符串插值运算符,用于转换数据并将其插入到字符串中。
例如
a = 2
b = 3
print "%d + %d = %d" % (a, b, a + b)
输出
2 + 3 = 5
在您的代码中,value
是一个字符串,因此解释器尝试对其进行字符串插值,value % 2
但随后它发现这value
不是格式化数据的有效格式字符串2
,因此它为您提供了TypeError
.
在现代代码中,%
不鼓励使用 -style 字符串格式,并且str.format
首选该方法。等价于上面的例子是:
print "{0} + {1} = {2}".format(a, b, a + b)
在 Python 2.7 及更高版本中,您可以省略字段编号:
print "{} + {} = {}".format(a, b, a + b)
我对您的代码还有一些评论。
在 Python 中调用函数时,通常不会在函数名后加空格。
在调用之前无需使用print
打印提示raw_input
:您可以(并且应该)将提示作为参数提供给raw_input
.
执行整数除法时,您应该使用整数除法运算符//
。单斜杠在 Python 2 中可以正常工作,但在 Python 3 中,它不会像预期的那样运行,因为它会执行浮点除法。例如,10 / 2
将导致5.0
.
当您需要对变量执行单个操作并将该操作的结果保存回同一变量时,您可以使用增强赋值运算符。例如,
而不是i = i + 1
你可以写i += 1
;
而不是value = value // 2
你可以写value //= 2
.
此外,而不是
value = value * 3
value = value + 1
你可以做
value *= 3
value += 1
但是,当对一个变量执行多个操作时,在一行中执行这些操作会更加紧凑和高效。所以更常见的做法是:
value = value * 3 + 1
综上所述,这是您的代码的重新处理版本。
value = int(raw_input("Enter value: "))
i = 0
while True:
if value == 1:
break
elif value % 2 == 0:
value //= 2
else:
value = value * 3 + 1
i += 1
print "After {} attempts the conjecture has been demonstrated.".format(i)