TypeError: 'int' object is not iterable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lexaiden
User
Beiträge: 16
Registriert: Montag 15. Juli 2013, 22:11

Ich bekomme als Fehler für die Zeile 6 und Zeile 9: TypeError: 'int' object is not iterable
Ich verstehe leider nicht wieso. Wenn ich die Funktion so aufrufe aichHashTable(52) erwarte ich für max(hashTable[-1]) eine 52, das stimmt so auch wenn ich mir dass per print() ausgeben lasse. Warum also ist while max(hashTable[-1]) > 1 dann nicht wahr, bzw. warum kommt der genannte Fehler?

Code: Alles auswählen

    def aichHashTable(self, numberOfBlockhashs):
        hashTable = []
        hashTable.append([])
        hashTable[-1].append(numberOfBlockhashs)

        while max(hashTable[-1]) > 1:
            hashTable.append([])
            leftRight = "left"
            for item in hashTable[-2]:
                if item > 1:
                    number = item / 2
                    if leftRight == "left":
                        hashTable.append(number + (item % 2))
                        hashTable.append(number)
                    else:
                        hashTable.append(number)
                        hashTable.append(number + (item % 2))
                else:
                    hashTable.append(0)
                leftRight = leftRight == "left" if "right" else "left"

        print(hashTable)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann schau doch noch einmal genau hin, wass du so in die Liste packst ;-)

Ein deinem Code sind insgesamt noch sehr viele Dinge, welche verbessert werden müssen. Als erstes solltest du dir mal PEP 8 bezüglich der Namensgebung anschauen. Dann wird dein Code gleich etwas schöner.

Die Zeilen zwei bis vier sind bei dir einfach nur unglaublich kompliziert für

Code: Alles auswählen

hashTable = [[numberOfBlockhashs]]
Plural von "Hash" ist übrigens "Hashes".

Auch an deiner Namensgebung solltest du noch arbeiten. Was soll "leftRight" bedeuten? Und für "item" fällt dir sicher ein Name ein, welcher nicht so generisch ist.

Code sollte nicht kopiert werden. Gleiche Anweisungen solltest du zusammenfassen. In Zeile 15 bis 17 sind sowohl die Berechnung als auch das Anhängen identisch.

Was glaubst du, was Zeile 20 macht?
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du hängst in der while-Schleife an deine äußere Liste weitere Werte an die keine Iterables sind und wenn du dann im nächsten Durchlauf mit max auf den letzten Wert zugreifst, dann kracht es natürlich.
BlackJack

@lexaiden: In Zeile 6 kommt die Ausnahme eher nicht und wenn sie in Zeile 9 kommt dann ist das vorletzte Element in `hashTable` ganz offensichtlich vom Typ `int` und eine ``for``-Schleife über eine Zahl geht halt nicht. Was sollte das auch bedeuten? Bleibt die Frage ob da eine Zahl in der Liste stehen sollte und wie die da hin kommt. Wie sie dort hin kommt, sollte man am Quelltext leicht sehen können — Du hängst da in mehreren Zeilen ganz offensicht ganze Zahlen an die Liste an.

Sollte `leftRight` nicht besser ein Wahrheitswert sein? Das würde den Code wohl etwas vereinfachen und etwas weniger fehleranfällig machen wegen der wegfallenden die Zeichenkettenliterale die da wiederholt im Quelltext stehen und bei denen man immer aufpassen muss das man sich nirgends vertippt hat.

Ansonsten zur Namensschreibweise ein Hinweis auf den Style Guide for Python Code.
lexaiden
User
Beiträge: 16
Registriert: Montag 15. Juli 2013, 22:11

@/me Besten Dank! Genau das wars was ich nicht gesehen habe.

Code: Alles auswählen

    def aichHashTable(self, numberOfBlockhashes):
        hashTable = [[numberOfBlockhashes]]

        while max(hashTable[-1]) > 1:
            hashTable.append([])
            leftNode = True
            for pendingHashNodes in hashTable[-2]:
                if pendingHashNodes > 1:
                    devidedNode = pendingHashNodes / 2
                    if leftNode:
                        hashTable[-1].append(devidedNode + (pendingHashNodes % 2))
                        hashTable[-1].append(devidedNode)
                    else:
                        hashTable[-1].append(devidedNode)
                        hashTable[-1].append(devidedNode + (pendingHashNodes % 2))
                else:
                    hashTable[-1].append(0)
                leftNode = False if leftNode else True

        print(hashTable)
@EyDu Zeile 20 wechselt die Variable leftRight zwischen "left" und "right". Habs mal in True/False geändert. Nachtrag: Jetzt verstehe ich die Frage, die Syntax war falsch. Gerade gemerkt.

@BlackJack da hatte ich mich vielleicht etwas missverständlich ausgedrückt, ich meinte wenn ich den Fehler in Zeile 6 ignoriere/überspringe, dann bekomm ich den gleichen Fehler in Zeile 9. Was genau passt Dir denn an meinem Code nicht das Du mich auf PEP8 verweisen musst? CamelCase ist nicht verboten und ich hab keine Lust immer den Codingstyle zu wechseln, nur weil ich die Sprache wechsel. Solange flake8 mich nicht anmault seh ich es als ok an.
BlackJack

@lexaiden: Jetzt wo `leftNode` ein Wahrheitswert ist kann man ``not`` verwenden um die Richtung umzukehren.

CamelCase ist ”verboten”. Es ist ein Guide und es sind keine Rules, aber soweit das in einem Dokument das *nichts* verbietet nun mal geht ist CamelCase für etwas anderes als Klassen nicht vorgesehen und auch kein mixedCase für *irgendwas*. Die Ausnahmen sind Code der halt dummerweise schon von vor PEP8 so vorliegt und Code der externe Bibliotheken anbindet wo schon eine andere Namenskonvention verwendet wird.

Mir ist echt noch nie jemand untergekommen der bei Java namen_mit_unterstrichen verwendet, obwohl da ja auch nichts gegen spräche, wenn man sich nicht an die Konventionen halten mag. Warum das bei Python irgendwie immer okay zu sein scheint ist mir ein Rätsel.

Ist das eigentlich Python 2 oder 3? Ich frage weil bei `print()` Klammern gesetzt sind, in den Listen aber Gleitkommazahlen landen würden bei Python 3 wegen dem ``/``. Soll das so?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

lexaiden hat geschrieben:@EyDu Zeile 20 wechselt die Variable leftRight zwischen "left" und "right". Habs mal in True/False geändert. Nachtrag: Jetzt verstehe ich die Frage, die Syntax war falsch. Gerade gemerkt.
Nee, die Syntax war in Ordnung. Überleg dir doch mal genau, was bei

Code: Alles auswählen

"left" if "right" else "left"
für ein Ergebnis bei raus kommt.
lexaiden hat geschrieben:CamelCase ist nicht verboten und ich hab keine Lust immer den Codingstyle zu wechseln, nur weil ich die Sprache wechsel. Solange flake8 mich nicht anmault seh ich es als ok an.
Wenn du in einer Sprache programmierst, dann solltest du dich auch an deren Konventionen halten. Die haben ja alle ihren Sinn und vereinfachen das lesen. Die meisten hier wechseln, wahrscheinlich auch mehrmals täglich, zwischen verschiedenen Sprachen und haben dabei keinerlei Probleme.
Das Leben ist wie ein Tennisball.
Antworten