2016-08-11 5 views
0

Ich arbeite gerade an Projekt Euler Problem 4 (https://projecteuler.net/problem=4) und bekomme ständig einen Fehler, wenn ich versuche, meinen Code auszuführen. Ich habe mir andere Fragen zu dem 'int' Objekt angeschaut, die nicht iterierbar sind, aber keine gefunden haben, die mir bisher geholfen haben. Hier ist mein aktueller Code:'int' Objekt ist nicht iterierbar Fehler (Projekt Euler 4)

# Euler 4 
# Find the largest palindrome made from the product of two 3-digit numbers 
j = [] 
i = None 
for x,y in range(1,1000): 
    j.append(x*y) 

    for i in range(1,j.length): 
     if (str(j[i]))[::-1] == str(j[i]): 
      print j 

Als ich das laufen ließe, erhalte ich folgende Fehlermeldung:

Traceback (most recent call last): 
    File "C:\Users\Daniel Bashir\Desktop\HMC\Projects\Python\Project Euler\PE4.py", line 5, in <module> 
    for x,y in range(1,1000): 
TypeError: 'int' object is not iterable 

Die meisten des Updates Ich habe für diesen for-Schleife Problem gesehen beinhalten Ändern „für ein in b "zu" für eine in Reichweite ... ", aber ich habe diese Syntax schon hier.

Kann mir jemand helfen, herauszufinden, was los ist?

Alle allgemeinen Kommentare zu meinem Code sind ebenfalls willkommen. Ich bin nur ein Anfänger!

+3

Was denken Sie 'Bereich (1, 1000)' erzeugt? Was erwarten Sie von 'x' und' y'? – TigerhawkT3

+1

Wenn Sie ein Anfänger sind, würde ich _very highly_ wärmstens empfehlen, eine Klasse oder ein Tutorial zu beenden, bevor Sie in Coding-Herausforderungen springen. – TigerhawkT3

+0

Nach dem ersten Kommentar von TigerhawkT3 ist 'x, y' _nicht_ das Gleiche wie ein einsames' x' gefolgt von einem einsamen 'y'. –

Antwort

1

Bereich (Start, Ende) ergibt ganze Zahlen

mit diesen

for x,y in range(1,1000): 

Sie versuchen, eine ganze Zahl iterieren (1) Sie eine ganze Zahl nicht iterieren kann

Sie wollen

for x in range(1,1000): 
+2

Um zu verdeutlichen, gibt 'range (start, end)' keine Ganzzahl zurück - es liefert Ganzzahlen, wenn Sie darüber iterieren. – TigerhawkT3

+0

@ TigerhawkT3 wahre dat. Sonst steckst du in einer Endlosschleife fest! aktualisiert. –

0

Sie versuchen (ohne es zu merken), über e ACH ganze Zahl durch die range Funktion ergab:

for x,y in range (1,1000): 
    j.append(x*y) 

Das Komma in x,y macht diese drei Zeichen ein einzelnes 2-Tupel, die nicht die gleiche wie zwei Variablen ist x und y ... besonders wenn sie auf der linken Seite einer Zuweisungsanweisung. Ja, for ist eine Zuordnungsanweisung --- etwa tausend von ihnen, in Ihrem Fall --- mit dem x,y Tupel auf der linken Seite und eine ganze Zahl auf der rechten Seite:

(x, y) = 1  # TypeError: 'int' object is not iterable 
(x, y) = 2  # It never gets this far... 
#... 
(x, y) = 1000 # ...but it's trying to. 

zu einem Tupel Zuordnung verwendet Sequenz Entpacken (am Ende des Abschnitts "Tuples and Sequences" beschrieben), die über die Werte iteriert und sie den Variablen innerhalb des Tupels zuweist. Aber es gibt keine Sequenz von Werten in Ihrem Code, nur eine int, die direkt zu der "int 'Objekt ist nicht iterable" Fehlermeldung führt.

Als luke_aus answered, können Sie das unmittelbare Problem lösen, indem das Tupel mit einem einzigen Variable ersetzt, aber das bedeutet y nie zugewiesen wird:

for x in range(1, 1000): 
    j.append(x * y) # NameError: name 'y' is not defined 

In diesem Fall aber müssen Sie nicht y an alle.Es ist immer gleich x, so dass nur x verwenden:

for x in range(1, 1000): 
    j.append(x * x) 

Oder, wenn Sie wirklich wird müssen, dass y später nur y zuweisen, wenn "später" geschieht:

for x in range(1, 1000): 
    j.append(x * x) 
    #... 
    y = something_else() # Later is now! 
    do_something_with_both(x, y) 
Verwandte Themen