@Inatrox: Die Funktion ist komisch bis fehlerhaft. Die beiden Spezialfälle sollte es nicht geben, denn egal womit man die Funktion aufruft, werden immer die erste Zahl geliefert. Das sollte nicht sein. Die Funktion ist dadurch auch unnötig ”speziell”, denn man kommt auch ohne die beiden extra ``yield`` aus.
Dann bin ich persönlich ja kein Fan von Typannotationen. Aber gut, wenn man die schon verwendet, dann bitte *sinnvoll* und bei so etwas wie ``last: int = 0`` ist die Typannotation so was von unsinnig. Jeder Mensch sieht das da eine ganze Zahl zugewiesen wird. Und auch die Werkzeuge zur Typprüfung sehen das. Python ist nicht Java. (Und selbst Java hat mittlerweile ``auto``.)
`Generator` als Rückgabetyp zu annotieren macht IMHO auch keinen Sinn wenn man da weder was rein-senden kann, noch ``return <irgendwas>`` benutzt wird. Denn dann verhält der sich wie ein Iterator und der lässt sich einfacher annotieren.
`last` ist sprachlich nicht so astrein, das sollte `previous` heissen. Und `next` muss anders heissen weil das schon der Name einer eingebauten Funktion ist.
Auch Blöcke die nur eine Zeile lang sind, sollten nicht direkt nach dem ":" stehen, sondern in einer eigenen Zeile.
Ungetestet:
Code: Alles auswählen
from typing import Iterator
def fib(n: int) -> Iterator[int]:
current_number, next_number = 0, 1
for _ in range(n):
yield current_number
current_number, next_number = next_number, current_number + next_number