Zu viele Klammern

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
Bananasplit
User
Beiträge: 10
Registriert: Sonntag 11. Februar 2018, 10:18

Ich arbeite hier gerade an einen Programm und ich bin zu einer Stelle gekommen wo ich einfach viel zu viele Klammern benutzt haben. Ich weiß nicht wann ich keine Klammer setzten muss und jetzt habe ich manchmal 3 unnötige Klammern. Zwischen allen and Statements sollen die jeweils abgetrennt sein. Bei sonstigen Verbesserungs vorschlagen könnt ihr sie auch gerne geben. Ich habe übrigens Pillow verwendet. Also hier ist mein Code:

Code: Alles auswählen

        elif ((Bild.getpixel((((x-1),y))) == weiss)) and (Bild.getpixel(((x,(y+1))) == weiss)) and (Bild.getpixel(((x,(y-1))) == weiss)) and (Bild.getpixel((((x-1),(y-1))) == grun)):
            x = x - 1
            y = y + 1
        elif ((Bild.getpixel((((x+1),y))) == weiss)) and (Bild.getpixel(((x,(y+1))) == weiss)) and (Bild.getpixel(((x,(y-1))) == weiss)) and (Bild.getpixel((((x+1),(y-1))) == grun)):
            x = x + 1
            y = y + 1
        elif ((Bild.getpixel((((x-1),y))) == weiss)) and (Bild.getpixel(((x,(y+1))) == weiss)) and (Bild.getpixel(((x,(y-1))) == weiss)) and (Bild.getpixel((((x-1),(y+1))) == grun)):
            x = x - 1
            y = y - 1
        elif ((Bild.getpixel((((x+1),y))) == weiss)) and (Bild.getpixel(((x,(y+1))) == weiss)) and (Bild.getpixel(((x,(y-1))) == weiss)) and (Bild.getpixel((((x+1),(y+1))) == grun)):
            x = x + 1
            y = y - 1
        elif ((Bild.getpixel(((x,(y-1))) == weiss)) and (Bild.getpixel((((x+1),y)) == weiss)) and (Bild.getpixel((((x-1),y)) == weiss)) and (Bild.getpixel((((x-1),(y-1))) == grun))):
            x = x + 1
            y = y - 1
        elif ((Bild.getpixel(((x,(y+1))) == weiss)) and (Bild.getpixel((((x+1),y)) == weiss)) and (Bild.getpixel((((x-1),y)) == weiss)) and (Bild.getpixel((((x+1),(y-1))) == grun))):
            x = x + 1
            y = y + 1
        elif ((Bild.getpixel(((x,(y-1))) == weiss)) and (Bild.getpixel((((x+1),y)) == weiss)) and (Bild.getpixel((((x-1),y)) == weiss)) and (Bild.getpixel((((x-1),(y+1))) == grun))):
            x = x - 1
            y = y - 1
        elif ((Bild.getpixel(((x,(y+1))) == weiss)) and (Bild.getpixel((((x+1),y)) == weiss)) and (Bild.getpixel((((x-1),y)) == weiss)) and (Bild.getpixel((((x+1),(y+1))) == grun))):
            x = x - 1
            y = y + 1
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oh Gott. Die unmittelbare Maßnahme wäre, die ganzen getpixeleien vor die if-Kaskade zu ziehen. Mit sinnvollen Namen. Also zb left, topleft, right, etc.

Und dann deine Tests damit zu schreiben. Außerdem kann man dann zb

Code: Alles auswählen

if (topleft, bottomright, center) == (white, green, blue):
schreiben.
Bananasplit
User
Beiträge: 10
Registriert: Sonntag 11. Februar 2018, 10:18

Also das ich zum Beispiel ((x+1),(y+1)) als topleft einspeichere?
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

@Bananasplit
Weshalb machst du um 'x + 1' und 'y + 1' eine Klammer? Äußere Klammern bei Funktions-/Methodenaufrufen sind notwendig. Klammern um jeden einzelnen einfachen Ausdruck nicht.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jein. Direkt schon den Pixel-Wert:

Code: Alles auswählen

right = Bild.getpixel(x, y+1)
Bananasplit
User
Beiträge: 10
Registriert: Sonntag 11. Februar 2018, 10:18

Also ich habe es jetzt so

Code: Alles auswählen

rechts = Bild.getpixel(((x+1),y))
links = Bild.getpixel(((x-1),y))
oben = Bild.getpixel((x,(y-1)))
unten = Bild.getpixel((x,(y+1)))
obenlinks = Bild.getpixel(((x-1),(y-1)))
untenlinks = Bild.getpixel(((x-1),(y+1)))
obenrechts = Bild.getpixel(((x+1),(y-1)))
untenrechts = Bild.getpixel(((x+1),(y+1)))
und im Code so

Code: Alles auswählen

        elif (((rechts and oben and unten) == weiss) and (obenlinks == grun)) or (((oben and links and rechts) == weiss) and (untenrechts == grun)):
            x = x - 1
            y = y + 1
        elif (((links and oben and unten) == weiss) and (obenrechts == grun)) or (((oben and links and rechts) == weiss) and (untenlinks == grun)):
            x = x + 1
            y = y + 1
        elif (((rechts and oben and unten) == weiss) and (untenlinks == grun)) or (((unten and links and rechts) == weiss) and (obenrechts == grun)):
            x = x - 1
            y = y - 1
        elif (((rechts and oben and unten) == weiss)) and (untenrechts == grun) or (((unten and links and rechts == weiss)) and (obenlinks == grun)):
            x = x + 1
            y = y - 1
Das sieht schon ordentlich aus aber es funktioniert nicht. Habe ich etwas falsch gemacht? Wenn ja, was?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schau mal genau hin was ich dir gezeigt habe. Für drei Pixel musst du auch drei Farben vergleichen. Auch wenn das dreimal weiß sein sollte.
Bananasplit
User
Beiträge: 10
Registriert: Sonntag 11. Februar 2018, 10:18

Code: Alles auswählen

        elif (((rechts,oben,unten) == weiss,weiss,weiss) and (obenlinks == grun)) or (((oben,links,rechts) == weiss,weiss,weiss) and (untenrechts == grun)):
            x = x - 1
            y = y + 1
        elif (((links,oben,unten) == weiss,weiss,weiss) and (obenrechts == grun)) or (((oben,links,rechts) == weiss,weiss,weiss) and (untenlinks == grun)):
            x = x + 1
            y = y + 1
        elif (((rechts,oben,unten) == weiss,weiss,weiss) and (untenlinks == grun)) or (((unten,links,rechts) == weiss,weiss,weiss) and (obenrechts == grun)):
            x = x - 1
            y = y - 1
        elif (((rechts,oben,unten) == weiss,weiss,weiss) and (untenrechts == grun)) or (((unten,links,rechts) == weiss,weiss,weiss) and (obenlinks == grun)):
funktioniert immer noch nicht...
Ich fühle mich dumm...
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bananasplit: es gibt verschiedene Operatoren und die haben unterschiedliche Prioritäten. Aus Mathe kennt man "Punkt vor Strich". Das Komma hat da niederste Priorität, so dass Klammern um Ausdrücke, die mit Kommata getrennt sind, nicht geklammert werden: »((x-1), (y+1))« -> »(x-1, y+1)«. »and« ist ein logischer Operator, der z.B. eine niedrigere Priorität hat, als Vergleichsoperatoren:

Code: Alles auswählen

elif Bild.getpixel((x-1,y)) == weiss and Bild.getpixel((x, y+1)) == weiss and Bild.getpixel((x,y-1)) == weiss and Bild.getpixel((x-1, y-1)) == grun:
Bei Deinem nächsten Beispiel hast Du da auch noch zu viele Klammerungen und außerdem benutzt Du »and« falsch. Schau mal an, was »rechts and oben and unten« für ein Ergebnis hat.
Beim letzten Fall fehlen dann an entscheidender Stelle Klammern. Laß Dir doch einfach mal das Ergebnis von Teilausdrücken ausgeben.
Antworten