尝试对一个数字的各个位数求和时出现“int对象不可迭代”的错误?

27

我有这段代码:

inp = int(input("Enter a number:"))

for i in inp:
    n = n + i;
    print (n)

但是它抛出了一个错误:'int' object is not iterable

我想通过将每个数字相加来找到总数,例如110。1 + 1 + 0 = 2。我该怎么做?


如果你把这些数字放在一起,那么应该是110。我不确定11是从哪里来的。 - Sasha Chedygov
3
好的,我可以为你进行翻译。以下是您需要翻译的内容:@Trent: http://en.wikipedia.org/wiki/Unary_numeral_system - configurator
https://dev59.com/WmUp5IYBdhLWcg3w669C - user345352353
相关:什么是迭代器、可迭代对象和迭代?(特别是“可迭代对象”部分)。 - Karl Knechtel
11个回答

26

首先,删掉那个 int 调用 - 你正在将一串字符转换为整数,这不是你想要的(你想将每个字符视为它自己的数字)。将其更改为:

inp = int(input("Enter a number:"))
至:
inp = input("Enter a number:")

现在,inp 是一个数字字符串,你可以逐个数字地循环遍历它。

接下来,给n赋一个初始值--根据你的代码,你将会得到一个NameError,因为你没有初始化它。假设你希望在 for 循环之前执行 n = 0

然后,再次考虑字符和整数之间的区别。你现在有:

n = n + i;

此外,除了无用的分号(Python 是一种基于缩进的语法),它还试图将字符 i 加到整数 n 上 —— 这是行不通的!因此,这里需要进行如下修改

n = n + int(i)

将字符 '7' 转换成整数 7,以此类推。


13

也许你正在尝试

for i in range(inp)

这将打印您的输入值(inp)次数,如果只想打印一次,请按照以下方法操作: for i in range(inp - inp + 1) print(i)

我刚遇到了这个错误,因为我没有使用range()


那怎么解决问题呢?OP想要迭代数字的每个位,而不是迭代“number”次数... - Tomerikoo

7

尝试:

for i in str(inp):

这将迭代字符串表示中的字符。一旦您获得每个字符,您可以像单独的数字一样使用它。


嗯...它说TypeError: unsupported operand type(s) for +: 'int' and 'str' - eozzy
1
添加时是否需要将其转换为整数? - Brian R. Bondy
1
当你将它添加到整数时,它现在是一个字符串。因此,在这种情况下,您可以说int(i) + n或任何其他操作。 - Gavin H

5

好的,你想处理表示数字的字符串,需要迭代数字的每个位数,而不是迭代数字本身(数字本身是一种抽象的实体,可以用不同的方式写出,比如罗马数字中的"CX"或十六进制中的"0x6e"(都表示110)等等)。

因此:

inp = input('Enter a number:')

n = 0
for digit in inp:
     n = n + int(digit)
     print(n)

请注意,n = 0 是必需的(在进入循环之前某个地方)。您无法获取不存在的变量的值(右侧的 n = n + int(digit)n 的值)。如果此时 n 存在,它可能保存与您目前需要的完全不相关的内容,导致意外行为;您需要加以防范。
此解决方案没有尝试确保用户提供的输入实际上是一个数字。我会留下这个问题让您考虑(提示:所有你需要的都在Python教程中)。

这个方法很好,我建议将其制作成一个函数,如果操作者了解inp是全局变量并保持n为本地变量,这样当完成并再次调用时它会重置为零。 - rhymsy

3

顺便提一下:如果你想得到所有数字的总和,只需简单执行以下操作:

print sum(int(digit) for digit in raw_input('Enter a number:'))

1

正如ghills已经提到的那样

inp = int(input("Enter a number:"))

n = 0
for i in str(inp):
    n = n + int(i);
    print n

当您循环遍历某些内容时,关键字是“IN”,请始终将其视为某些东西的列表。您无法循环遍历纯整数。因此,它不可迭代。

1

for .. in 语句期望您使用已定义迭代器的类型。简单 int 类型没有迭代器。


0

将您的输入转换为字符串,以便可以进行迭代。

然后执行列表推导,并将每个值更改回数字。

现在,如果您想要,可以对所有数字进行求和:

inp = [int(i) for i in str(input("Enter a number:"))]
print sum(inp)

或者,如果你真的想在执行时看到输出:

def printadd(x,y):
    print x+y
    return x+y

inp = [int(i) for i in str(input("Enter a number:"))]
reduce(printadd,inp)

0

对于 OP 的问题(“我想通过将每个数字相加来找出总和,例如,110。1 + 1 + 0 = 2。我该怎么做?”),一个可能的答案是使用内置函数 divmod()

num = int(input('Enter a number: ')
nums_sum = 0

while num:
    num, reminder = divmod(num, 10)
    nums_sum += reminder

-1
不要将它变成一个int(),而是将其变成range()就可以解决这个问题。
inp = range(input("Enter a number: "))

那怎么解决问题呢?OP想要迭代数字的每个数字,而不是迭代“number”次数... - Tomerikoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接