Seite 1 von 1

Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 10:21
von Bananasplit
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

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 10:27
von __deets__
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.

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 10:32
von Bananasplit
Also das ich zum Beispiel ((x+1),(y+1)) als topleft einspeichere?

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 10:37
von nezzcarth
@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.

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 11:01
von __deets__
Jein. Direkt schon den Pixel-Wert:

Code: Alles auswählen

right = Bild.getpixel(x, y+1)

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 12:24
von Bananasplit
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?

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 12:26
von __deets__
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.

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 12:33
von Bananasplit

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

Re: Zu viele Klammern

Verfasst: Sonntag 11. März 2018, 12:41
von Sirius3
@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.