Python:Int不可迭代的错误

时间:2009-10-17 20:42:09

标签: python

我试图在Project Euler上用python弄湿我的脚,但是我遇到了第一个问题的问题(找到3或5的倍数之和到1000)。我可以成功打印出三和五的倍数,但是当我尝试包含sum函数时,我得到以下错误:

  

TypeError:'int'对象不可迭代

任何帮助将不胜感激。

n = 100
p = 0
while p<n:
   p = p + 1
x = range(0, p)

# check to see if numbers are divisable by 3 or 5
def numcheck(x): 
   for numbers in x:
      if numbers%3==0 and numbers%5==0:
          sum(numbers)
numcheck(x)

6 个答案:

答案 0 :(得分:7)

在for循环中

for numbers in x:

“数字”逐步遍历x中的元素,每次遍历循环。 将变量命名为“number”可能更好,因为你只是得到了 一次一个号码。 “数字”每次通过循环等于整数。

sum(numbers)

抛出一个TypeError,因为函数sum()需要一个可迭代对象(比如一个数字列表),而不只是一个整数。

所以也许试试:

def numcheck(x):
    s=0
    for number in x:
        if number%3==0 and number%5==0:
            s+=number
    print(s)
numcheck(range(1000))

答案 1 :(得分:5)

数字在传递给sum()时需要是一个列表或类似的。在上面的代码示例中,它是一个整数 - 来自x。

的整数之一

尝试类似:

numbers = [num for num in x if num%3==0 and num%5 ==0]
print sum(numbers)

答案 2 :(得分:1)

sum函数需要一个列表,而不是一个数字。

执行for numbers in时,变量numbers只有一个整数对象。添加print语句,您会看到numbers是一个数字。

您可能希望在列表中累积3和5的所有倍数。获得列表后,您可以使用该列表中的sum函数。

答案 3 :(得分:1)

我认为你想要的是接下来的东西。

def numcheck(x):
    total = 0
    for number in x:
        if number % 3 == 0 or and number % 5 == 0:
            total += number
    print total

或者,您可以将每个可分割的数字附加到列表中,然后在该列表上调用sum()。

答案 4 :(得分:1)

帮助(总和) 在模块内置

中帮助内置函数求和

和(...)     sum(sequence [,start]) - &gt;值

Returns the sum of a sequence of numbers (NOT strings) plus the value
of parameter 'start' (which defaults to 0).  When the sequence is
empty, returns start.

(完)

您将int类型的数字传递给sum(),但sum需要一个序列。

答案 5 :(得分:1)

我将如何做到这一点:

n = 100

# the next 4 lines are just to confirm that xrange is n numbers starting at 0
junk = xrange(n)
print junk[0]  # print first number in sequence
print junk[-1] # print last number in sequence
print "================"

# check to see if numbers are divisable by 3 or 5
def numcheck(x): 
   for numbers in x:
      if numbers%3==0 and numbers%5==0:
          print numbers

numcheck(xrange(n))

您可能会发现我将xrange(n)作为参数传递给我很奇怪。这是一个迭代器 当您在numcheck中循环时,最终将生成n个数字的列表。这有点像将指针传递给C中的函数。关键是通过使用xrange,您不需要为数字列表分配任何内存,因此您可以更轻松地对前十亿个整数进行检查,例如。