primitive Pythagoreische Tripel

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Die ersten Remarks würde ich in einen Docstring des Moduls verwandeln.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo,

in Zeile 63 würde ich erwarten, dass die "is_primitive"-Funktion verwendet wird.

Die while-Schleife in Zeile 140 würde ich noch so umstellen, dass das "i += 1" im try-Block steht, die beiden "continue" können dann eingespart werden. Es ginge auch noch ohne doppelten Code, aber wirklich schöner als deine Lösung ist es auch nicht. Der Ersatz von "i" und "numbers[-1]" sind für dich vielleicht aber trotzdem interessant:

Code: Alles auswählen

while len(numbers) != n:
            try:
                self.screen.addstr(self.cursory + len(numbers) + 2, self.cursorx, "> ")
                numbers += [int(self.screen.getstr())]
                if numbers[-1] < 1:
                    raise NegativeNumber(numbers[-1])
                continue
            except ValueError:
               pass
            except NegativeNumber:
                numbers.pop()

            self.screen.move(self.cursory + len(numbers) + 2, self.cursorx +  8)
            self.screen.clrtoeol()
Wenn doppelter Code nicht in eine sinnvolle Methode gepackt werden kann, dann würde ich keine Methode daraus machen. Zumindest nicht, wenn er so lokal begrenzt ist wie in diesem Fall.

Noch etwas Geschmackssache in Zeile 201:

Code: Alles auswählen

if n < self.height:
    height, width = self.height, self.width
else:
    height, width = n + 2, self.width + n / 100
pad = curses.newpad(height, width)
Die Bedingungen aus den Zeilen 227 und 230 würde ich, wie in den Zeilen davor auch, in die Bedingung darüber ziehen.

Der "\" in den Zeile 126 ist überflüssig, bei Klammern kann man sich die Kennzeichnung sparen. Das kommt in deinem Code noch etwas öfter vor.

Für Zeile 177 empfehle ich noch einen Blick in Richtung "String Formatting". Das würde ich in einer extra Zeile erledigen und nicht direkt als Parameter.

Vielleicht solltest du noch die ein oder andere Konstante einführen.

Meine Tipps und Hinweise sind aber alles nur Kleinigkeiten, der Code sieht sonst wirklich sauber aus.
Das Leben ist wie ein Tennisball.
Benutzeravatar
JaKlaRo
User
Beiträge: 10
Registriert: Dienstag 14. Juli 2009, 11:52
Wohnort: Bochum

Hallo
birkenfeld hat geschrieben:Warum muss man im Menü mit Space bestätigen, statt Enter?
Wegen:
KEY_ENTER Enter or send (unreliable)
Nachzulesen hier: http://docs.python.org/library/curses.html
Ich habe `KEY_ENTER` ausprobiert, funktioniert bei mir jedoch nicht. :?

@birkenfeld: Was soll denn dieser Link: `http://pyside.blogspot.com`?
Eydu hat geschrieben:in Zeile 63 würde ich erwarten, dass die "is_primitive"-Funktion verwendet wird.

Code: Alles auswählen

#  Der hier verwendete Algorithmus zur Erzeugung primitiver PTs
#  benutzt die zwei Hilfsvariablen "s" und "t". Für s und t
#  gelten drei Bedingungen:
#  1. t < s
#  2. s und t sind teilerfremd.
#  3. Wenn s gerade, dann t ungerade und umgekehrt.

    while True:
        for t in range(1 + s % 2, s, 2):
            if euklid_algorithm(s, t) == 1:
                yield (2 * s * t, s**2 - t**2, s**2 + t**2)
        s += 1
Die erste und dritte Bedingung wird mit `range(1 + s % 2, s, 2)` erledigt, die zweite mit `euklid_algorithm(s, t) == 1`.
Zeilen 227 und 230 hatte ich schon abgeändert, 2o1 und 140... habe ich von Dir übernommen, 177 sieht jetzt so aus:

Code: Alles auswählen

string = "%d, %d und %d sind %s Pythagoreisches Tripel%s" % \
         (leg_a, leg_b, hypothenuse, message_var[message_key][0], message_var[message_key][1])
self.screen.addstr(self.cursory + 6, self.cursorx -10, string)
Gruß und Dank
JaKlaRo
Antworten