Fibonacci-Sequenz darstellen

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.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Danke :D Habe es zu:

Code: Alles auswählen

 for i in range(10):
        print i, fibonacci_sequence.next()
   
    print fibonacci_sequence.get()
 
    for i in reversed(range(9)):
        print i, fibonacci_sequence.previous()
   
geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Xfd7887a: wunderbar, jetzt hast Du Python3-Variante von xrange und das print von Python 2. Was ist der Vorteil der get-Methode? tmp ist unnötig, weil man die Rechnung auch kürzer als

Code: Alles auswählen

self.a, self.b = self.b, self.a + self.b
schreiben kann.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Die aktualisierte Version:

Code: Alles auswählen

class FibonacciIterator(object):
    def __init__(self):
        self.a = self.b = 1

    def next(self):
        self.a, self.b = self.b, self.a + self.b
        return self.a

    def previous(self):
        self.a, self.b = self.b - self.a, self.a
        return self.a

    def __str__(self):
        return "{} {}".format(self.a, self.b)


def main():
    fibonacci_sequence = FibonacciIterator()
    print fibonacci_sequence.a

    for i in xrange(10):
        print i, fibonacci_sequence.next()
   
    print fibonacci_sequence.a
 
    for i in reversed(xrange(9)):
        print i, fibonacci_sequence.previous()
   
    try:
        fibonacci_sequence.previous()
    except Exception as error:
        assert isinstance(error, StopIteration)

if __name__ == "__main__":
    main()
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Muss ich nun den Number Overflow auch in Python beachten?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Gib doch mal in der Konsole 2**512 ein und was da kommt, klärt vermutlich deine Frage.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Ja, da kommt "13407...96L" raus. Steht das L am Ende für "long"? Und wie kann ich dieses abfangen?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ja. Mach daraus einen String.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Code: Alles auswählen

    def next(self):
        if str(self.a + self.b)[-1] == "L":
            return ...
        self.a, self.b = self.b, self.a + self.b
        return self.a

    def previous(self):
        if self.b == 1:
            return ...
        self.a, self.b = self.b - self.a, self.a
        return self.a
Sorry wegen meinen vielen Fragen, aber was muss ich jetzt zurückgeben?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du willst da ein Problem lösen, welches gar nicht existiert. Integer können in Python beliebig groß werden. Zumindest so groß, bis dein Arbeitsspeicher voll ist.
Das Leben ist wie ein Tennisball.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Also kann ich dieses Problem doch ignorieren?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nee. Es gibt da kein Problem das du ignorieren könntest ;-)
Das Leben ist wie ein Tennisball.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

In Ordnung :D
Hier noch mal der bisherige Stand:

Code: Alles auswählen

class FibonacciIterator(object):
    def __init__(self):
        self.a = self.b = 1

    def next(self):
        self.a, self.b = self.b, self.a + self.b
        return self.a

    def previous(self):
        self.a, self.b = self.b - self.a, self.a
        return self.a

    def __str__(self):
        return "{} {}".format(self.a, self.b)


def main():
    fibonacci_sequence = FibonacciIterator()
    print fibonacci_sequence.a

    for i in xrange(10):
        print i, fibonacci_sequence.next()
   
    print fibonacci_sequence.a
 
    for i in reversed(xrange(9)):
        print i, fibonacci_sequence.previous()
   
    try:
        fibonacci_sequence.previous()
    except Exception as error:
        assert isinstance(error, StopIteration)

if __name__ == "__main__":
    main()
Kann ich jetzt versuchen, eine GUI aufzusetzen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Xfd7887a hat geschrieben:Kann ich jetzt versuchen, eine GUI aufzusetzen?
Ja. Dabei solltest du FibonacciIterator aber nirgends verändern.

Der Code ist ein wenig sinnlos:

Code: Alles auswählen

try:
    fibonacci_sequence.previous()
except Exception as error:
    assert isinstance(error, StopIteration)
Da kann gar keine StopIteration auftreten. Und wenn du nur die StopIteration-Exception abfangen willst, dann kannst du das einfach in die dritte Zeile schreiben.
Das Leben ist wie ein Tennisball.
BlackJack

An der Stelle sollte aber eine `StopIteration` auftreten können, zumindest Ich würde den Code nämlich nicht vor den Häschen-Urknall ins Negative laufen lassen sondern in dem Fall eine Ausnahme auslösen.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

OK, also kann ich nun versuchen eine GUI draufzusetzen. Da ich damit wenig erfahren bin, werden hier sicherlich noch einige Fragen meinerseits folgen :)
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Mein bisheriger Stand: https://github.com/toxinman/zeug/blob/master/t.py. Wie schaffe ich es nun, dass der Screen bei jedem Klicken auf "next" oder "previous" aktualisiert wird? Ist dieses ständige aktualisieren überhaupt eine gute Idee?
BlackJack

@Xfd7887a: Du müsstest Dir die `Label`-Exemplare irgendwo merken, zum Beispiel in einer Liste und dann jeweils die Differenz zwischen der Anzahl der `Label` und der Anzahl der darzustellenden Hasen an neuen `Label`-Exemplaren zusätzlich erstellen oder zerstören.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Habe es aktualisiert: https://github.com/toxinman/zeug/blob/master/t.py. Aber in der Liste befinden sich nur "None"s
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Xfd7887a: da sind Nones drinnen, weil Du den Rückgabewert von place in die Liste schreibst.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Habe das place jetzt entfernt. Muss ich jetzt noch eine eigene Methode zur Darstellung der Liste schreiben oder wie macht man das?
Antworten