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)