@scoobydo: Irgendwie hast Du so gut wie nichts von den Verbesserungsvorschlägen umgesetzt. Der Code ist immer noch voller Indexzugriffe. Das ist in Python unüblich, weil man direkt über Elemente iterieren kann. Und falls man *zusätzlich* einen Index benötigt, gibt es die `enumerate()`-Funktion. Python ist nicht C. Wenn man über mehrere Sequenzen parallel iterieren möchte, kann man die `zip()`-Funktion verwenden.
Zum Fehler: Schau Dir doch einfach mal an auf was Du hier alles den Index-Operator anwendest. Und welche Werte da jeweils hinter stehen. Dann findest Du schnell ein Objekt, dass gar nicht Indexierbar ist, weil es den Typ `float` hat. Also genau was die Fehlermeldung sagt. Und dann schaust Du wie dieser Wert zustande kommt und da sollte ziemlich offensichtlich sein warum das ein `float` ist. Weil da nämlich ein `float`-Wert zugewiesen wird.
Die Schrittweite 1 kann man sich bei `range()` übrigens sparen, dass ist bereits der Default-Wert.
Man könnte die einzelnen Arbeitsschritte dann noch in Funktionen stecken, damit auf Moduleben am Ende nicht alle möglichen Zwischenwerte existieren, die man überhaupt gar nicht mehr benötigt. Ein typisches Idiom für eine Hauptfunktion ist in Python:
Code: Alles auswählen
def main():
# Hier kommt das Hauptprogramm...
if __name__ == '__main__':
main()
Jetzt läuft die `main()`-Funktion nur wenn das Modul als Programm ausgeführt wird, aber nicht wenn man es nur importiert. So kann man beispielsweise in einer Python-Shell die Funktionen einzeln testen und ausprobieren.
Die Sonderbehandlung mit ``j == 0`` in der letzten Schleife kann man bestimmt eleganter Ausdrücken, so dass den Rechenausdruck nur einmal schreiben muss.
Edit: Ungetestet, dafür Python und keine furchtbaren Einbuchstaben-Namen:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def main():
with open('a1.txt') as lines:
messwerte = [list(map(float, line.split())) for line in lines]
#
# Kalibrierfunktion einlesen.
#
grad = int(input('Bitte geben Sie den Grad des Kalibrierpolynoms ein: '))
print('Geben Sie nun die Koeffizienten absteigend an!')
koeffizienten = [
float(input('Koeffizient {0}:'.format(i)))
for i in reversed(range(0, grad + 1))
]
#
# Umrechnen der Spannungen in eine Geschwindigkeit.
#
for row in messwerte:
wert = row[1]**grad * koeffizienten[0]
for i, koeffizient in enumerate(koeffizienten, 1):
wert += wert**(grad - i) * koeffizient
row[1] = wert
if __name__ == '__main__':
main()