2009-10-17 24 views
5

Estoy tratando de mojarme los pies con Python en Project Euler, pero tengo un problema con el primer problema (encuentre la suma de los múltiplos de 3 o 5 hasta 1,000) . Puedo imprimir con éxito múltiplos de tres y cinco, pero cuando intento de incluir la función de suma me sale el siguiente error:Python: Int no es un error iterable

TypeError: 'int' object is not iterable

se agradecería cualquier ayuda.

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) 
+1

Acabo de ejecutar el código que ha publicado y no he recibido ese error. Veo que editó su código para eliminar la línea que causó el error. ¿Cuál es tu pregunta ahora? –

+0

Woops, no me había dado cuenta de que lo había editado, un segundo. – TheOneTrueMorty

Respuesta

7

En los

for numbers in x: 

"números" pasos para-bucle a través de los elementos en x uno a la vez, para cada pasada a través del bucle. Quizás sería mejor nombrar la variable "número" porque solo obtiene un número a la vez. "números" es igual a un número entero cada vez que pasa el ciclo.

sum(numbers) 

tiros un TypeError debido a que la función sum() espera un objeto iterable (como una lista de números), no sólo un número entero.

Así que tal intento:

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

Cambié la respuesta aceptada a la suya por brindar una explicación, gracias (espero que pueda resolver el problema por mi cuenta). – TheOneTrueMorty

+0

+1 por sugerir que los nombres de variables coinciden con lo que realmente son. Es sorprendente cuántos errores se pueden evitar con solo tener nombres claros. –

1

La función sum espera una lista, ni un solo número.

Cuando hace for numbers in, entonces la variable numbers tiene un único objeto entero. Agregue una declaración print, verá que numbers es un número único.

Es posible que desee acumular todos los múltiplos de 3 y 5 en una lista. Una vez que tenga la lista, puede usar la función sum en esa lista.

5

números debe ser una lista o similar cuando se pasa a sum(). En el ejemplo de código anterior, es un número entero, uno de los enteros de x.

intentar algo como:

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

'sum' toma un iterable así que esto también funciona:' sum (n para n en x si n% 3 == 0 y n% 5 == 0) ' –

+0

Es la solución más Pythonic, y un one-liner . Reformular el código imperativo en las comprensiones es un tema digno en sí mismo. – smci

1

creo que quiere algo así como lo que sigue.

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

Como alternativa, puede agregar cada uno de los números divisibles a una lista, y luego llamar a sum() en esa lista.

+4

Es una pena que brinde la solución. –

1

ayuda (suma) Ayuda en suma función incorporada en el módulo incorporado :

suma (...) suma (secuencia [, start]) -> valor

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. 

(FINAL)

Está pasando números que son del tipo int a sum(), pero sum toma una secuencia.

1

Aquí es cómo iba a hacer esto:

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)) 

puede que le resulte extraño que me pase xrange (n) como parámetro. Este es un iterador que producirá la lista de n números a medida que avanza por el ciclo en la comprobación numérica. Es un poco como pasar un puntero a una función en C. Lo más importante es que al usar xrange, no necesita asignar memoria para la lista de números, por lo que puede controlar más fácilmente los primeros mil millones de enteros, por ejemplo.

+0

No estoy seguro de si todavía entiendo por completo Xrange (no estoy demasiado familiarizado con los punteros), tan desnudo conmigo. Así que mientras range genera una lista de, digamos 100 números, in situ, xrange generará un solo número, verifica si ese número coincide con las condiciones que le has dado, y continúa avanzando al siguiente número hasta que llegue 100? – TheOneTrueMorty

+0

'xrange()' se inventó porque a veces llamamos 'range()' y en realidad no queremos toda la lista. Un bucle 'for' en Python siempre establece su variable a elementos de una lista (o algo que no sea una lista que sea" iterable "). Supongamos que quieres hacer algo un millón de veces. Con 'for x in range (1000000):' construyes una lista de un millón de objetos enteros, y luego la usas una vez y la descartas. 'xrange()' en lugar de devolver una lista, devuelve un iterador, y el bucle 'for' sabe cómo pedir al iterador un valor a la vez. No es necesario construir y destruir una gran lista. – steveha

+1

'xrange()' funcionó muy bien, y en Python 3.x, ya no existe un 'range()' que devuelve una lista completa; 'range()' en Python 3.x actúa como 'xrange()' en Python 2.x. En Python 3.x si realmente desea la lista, simplemente haga esto: 'list (range (1000))' El tipo 'list' toma el iterador y lo convierte en una lista completa. De hecho, todas las funciones de método en Python que solían devolver listas completas devuelven iteradores en Python 3.x. Puede obligarlos a expandirse a una lista completa si lo desea, y cuando no les importa, el iterador es más eficiente. – steveha

Cuestiones relacionadas