0

当我运行下面的代码时,我得到一个错误。我在 StackOverflow 上看过这里,但最终没有解决我的问题。

print "insert value"
value = raw_input ()

flag = False
i = 0

while flag:
    if value == 1:
        flag = True
    elif value % 2 == 0:
        value = value / 2
    else:
        value = value * 3
        value = value + 1
    i = i + 1

print "After", i, "attempts the conjecture has been demonstrated"

elif我在逻辑测试中遇到错误,上面value% 2 == 0写着

not all arguments converted during string formatting

我认为问题出在变量类型上,但我尝试了input函数并强制int类型,value = int (input (....))但这也没有用。

4

2 回答 2

4

在空闲时,这对我有用

value = int(raw_input ())

将原始输入转换为整数

while True:
    if value == 1:
        break
    elif value % 2 == 0:
        value = value / 2
    else:
        value = value * 3
        value = value + 1
    i = i + 1

在没有任意标志的情况下做一个更简单的方法

于 2015-12-22T02:55:43.230 回答
2

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)
于 2015-12-22T08:06:29.797 回答