@Wabi_: Das ist ja auch das was man erwarten würde. Warum denkst Du denn es sollte dort kein `IndexError` ausgelöst werden? Geh das doch einfach mal Schritt für Schritt, Teilausdruck für Teilausdruck durch für -8. Das erste ``if`` trifft nicht zu. Beim zweiten ``if`` wird der Zweig ausgeführt. Als erstes wird `b` an eine Liste mit den zwei Elementen 0 und 1 gebunden. Dann kommt die ``for``-Schleife die aber nicht durchlaufen wird, weil `range(2, -7)` keine Elemente enthält. Und dann wird im letzten Schritt versucht auf das -8.te Element von der zweielementigen Liste zuzugreifen. Was ganz offensichtlich nicht geht, weil es dieses Element nicht gibt.
Code: Alles auswählen
In [261]: range(2, -8 + 1)
Out[261]: range(2, -7)
In [262]: len(range(2, -8 + 1))
Out[262]: 0
In [263]: list(range(2, -8 + 1))
Out[263]: []
In [264]: b = [0, 1]
In [265]: b[-8]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Input In [265], in <cell line: 1>()
----> 1 b[-8]
IndexError: list index out of range
Wie definierst Du denn überhaupt negative Fibonacci-Zahlen? Nach der üblichen Definition ist das ja eigentlich entweder undefiniert, also ein Fehler, oder man definiert alles vor dem Startzeitpunkt/-schritt als 0.
Bezüglich der Lösung für den positiven Teil ist das übrigens ziemlich ineffizient was den Speicherverbrauch angeht. Es macht nicht so wirklich Sinn *alle* Zahlen in einer Liste zu sammeln wenn man in jedem Schritt nur auf die letzten beiden Elemente zugreift. Man muss sich nur diese zwei Werte merken, die man für den jeweils nächsten Schritt benötigt. Die übliche Lösung dafür sieht so aus:
Code: Alles auswählen
def fib(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
Da würde ich dann auch gleich noch anmerken wollen, dass `a` und `b` keine wirklich guten Namen für Listen sind. Beide Variablen würden in Deinem Code passender den Namen `fibonacci_numbers` haben, denn das ist es was hinter dem Namen an Werten steckt.