2009-10-17 16 views
5

Ich versuche, meine Füße nass mit Python auf Projekt Euler, aber ich habe ein Problem mit dem ersten Problem (finden Sie die Summe der Vielfachen von 3 oder 5 bis 1.000) . Ich kann erfolgreich ein Vielfaches von drei ausdrucken und fünf, aber wenn ich die Summenfunktion zu schließen versuchen, bekomme ich folgende Fehlermeldung:Python: Int nicht iterierbaren Fehler

TypeError: 'int' object is not iterable

Jede Hilfe würde geschätzt.

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

Ich habe gerade den Code ausgeführt, den Sie gepostet haben, und habe diesen Fehler nicht erhalten. Ich sehe, dass Sie Ihren Code bearbeitet haben, um die Zeile zu entfernen, die den Fehler verursacht hat. Was ist deine Frage jetzt? –

+0

Woops, habe nicht bemerkt, dass ich das bearbeitet habe, eine Sekunde. – TheOneTrueMorty

Antwort

7

in der for-Schleife

for numbers in x: 

"numbers" Schritte durch die Elemente in x einer nach dem anderen, die jeweils durch die Schleife für. Es wäre vielleicht besser, die Variable "number" zu nennen, weil Sie nur jeweils eine Nummer bekommen. "Zahlen" ist jedes Mal eine ganze Zahl durch die Schleife.

sum(numbers) 

wirft eine Typeerror da die Funktion sum() eine iterable Objekt erwartet (wie eine Liste von Zahlen), nicht nur eine ganze Zahl ist.

Also vielleicht versuchen:

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

Geändert Antwort zu Ihrem für eine Erklärung auch, danke (hier hofft ich kann das nächste Problem auf eigene Faust). – TheOneTrueMorty

+0

+1 für das Vorschlagen, dass Variablennamen mit dem übereinstimmen, was sie tatsächlich sind. Es ist erstaunlich, wie viele Bugs verhindert werden können, nur durch klare Namen. –

1

Die Funktion sum erwartet eine Liste, keine einzelne Zahl. Wenn Sie for numbers in tun, dann hat die Variable numbers ein einzelnes Integer-Objekt. Fügen Sie eine print Anweisung hinzu, Sie werden sehen, dass numbers eine einzelne Zahl ist.

Sie könnten alle Vielfachen von 3 und 5 in einer Liste zusammenfassen. Sobald Sie die Liste haben, können Sie dann die sum Funktion in dieser Liste verwenden.

5

Zahlen müssen eine Liste oder ähnlich sein, wenn sie an sum() übergeben wird. Im obigen Codebeispiel handelt es sich um eine ganze Zahl - eine der ganzen Zahlen von x.

Probieren Sie etwas wie:

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

'summe' nimmt ein iterables, also funktioniert das auch:' summe (n für n in x wenn n% 3 == 0 und n% 5 == 0) ' –

+0

Das ist bei weitem die pythonischste Lösung und ein Einzeiler . Die Umwandlung von Imperativ-Code in Comprehensions ist ein ganzes würdiges Thema an sich. – smci

1

Ich glaube, Sie wollen etwas wie das, was folgt.

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

Alternativ können Sie jede der teilbaren Zahlen auf eine Liste anhängen und dann Summe() aufrufen, auf dieser Liste.

+4

Schande über Sie für die Bereitstellung der Lösung. –

1

Hilfe (sum) Hilfe auf eingebaute Funktion Summe in Modul builtin:

Summe (...) Summe (Folge [, Start]) -> Wert

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. 

(END)

Sie übergeben Zahlen vom Typ int an sum(), aber die Summe nimmt eine Folge.

1

Hier ist, wie ich dies tun würde:

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

Sie finde es seltsam, dass ich xrange (n) als Parameter übergeben. Dies ist ein Iterator, der schließlich die Liste der n Zahlen erzeugt, wenn Sie die Schleife in Numcheck durchlaufen. Es ist ein bisschen so, als würde man einen Zeiger auf eine Funktion in C übergeben. Das Entscheidende ist, dass man mit xrange keinen Speicher für die Liste von Zahlen reservieren muss, so dass man einfacher die ersten Milliarden Integer überprüfen kann, zum Beispiel.

+0

Ich bin mir nicht sicher, ob ich xrange noch ganz verstehe (mir sind Zeiger auch nicht allzu vertraut), so nackt mit mir. Während also range eine Liste von, sagen wir 100 Zahlen, vor Ort erzeugt, würde xrange eine einzige Zahl generieren, prüfen, ob diese Zahl mit den Bedingungen übereinstimmt, die Sie ihm gegeben haben, und weiter zur nächsten Zahl gehen 100? – TheOneTrueMorty

+0

'xrange()' wurde erfunden, weil wir manchmal 'range()' nennen und wir eigentlich nicht die ganze Liste wollen. Eine 'for'-Schleife in Python setzt ihre Variable immer auf Elemente aus einer Liste (oder auf etwas anderes als eine Liste, die" iterierbar "ist). Angenommen, Sie möchten eine Million Mal etwas tun. Mit 'for x in range (1000000):' erstellst du eine Liste von Millionen Integer-Objekten, und du benutzt sie dann einmal und wirfst sie weg. 'xrange()' gibt anstelle der Rückgabe einer Liste einen Iterator zurück, und die for-Schleife weiß, wie man den Iterator um jeweils einen Wert anfragt. Keine Notwendigkeit, eine riesige Liste zu erstellen und zu zerstören. – steveha

+1

'xrange()' hat sehr gut funktioniert, und in Python 3.x gibt es kein 'range()' mehr, das eine vollständige Liste zurückgibt; 'range()' in Python 3.x verhält sich in Python 2.x wie 'xrange()'. Wenn Sie in Python 3.x die Liste wirklich wollen, tun Sie das einfach: 'list (range (1000))' Der 'list' Typ nimmt den Iterator und verwandelt ihn in eine vollständige Liste. Tatsächlich geben alle Methodenfunktionen in Python, die für die Rückgabe vollständiger Listen verwendet wurden, Iteratoren in Python 3.x zurück. Sie können sie zwingen, auf eine vollständige Liste zu erweitern, wenn Sie möchten, und wenn Sie nicht interessiert sind, ist der Iterator effizienter. – steveha

Verwandte Themen