@Compunerd: Hattest Du das Modul denn schon einmal importiert *bevor* Du die Funktion geschrieben hast? ``import`` lädt nur beim ersten mal die Datei und führt den Code auf Modulebene aus, bei folgenden Importen wird einfach nur das beim ersten mal erstellte Modulobjekt erneut an den Namen nach ``import`` gebunden.
Die Funktion ist ziemlich gruselig. Angefangen bei schlechten Namen, die sich teilweise nicht an die Konventionen halten. Siehe
Style Guide for Python Code. Eingerückt wird mit vier Leerzeichen pro Ebene. Funktionsnamen beschreiben üblicherweise die Tätigkeit der Funktion.
Entscheidung aufgrund eines Datentyps sind nur sehr selten eine gute Idee weil sie „duck typing“ unterlaufen, und wenn dann nicht mit `type()` sondern mit `isinstance()` um wenigstens abgeleitete Typen erfassen zu können. Wobei ich diese Fallunterscheidung nicht nachvollziehen kann. Welchen Sinn hat die?
Die ``for``-Schleife ist in Python ein „anti-pattern“. Statt über Indices zu iterieren, die dann nur für den Zugriff auf eine Sequenz verwendet werden, kann man in Python *direkt* über die Elemente iterieren. Und statt eine Liste elementweise zu verändern, würde man in Python einfach eine neue aufbauen. Dann könntest Du Dir auch den `copy()`-Aufruf sparen. Mit „list comprehension“-Syntax wäre das dann auch schön kompakt.
Importe gehören an den Anfang von Modulen, damit man dort leicht die Abhängigkeiten des Moduls sehen kann, und einem die auch möglichst schnell auf die Füsse fallen wenn sie nicht erfüllt sind.
`y` ist überflüssig. Die erste Zuweisung an `y` ist sinnfrei weil der Wert danach nirgends verwendet wird. Und statt `B` in `y` umzubenennen, hätte man einfach `B` im `dot()`-Aufruf verwenden können.
Wenn die Elemente weder ganze Zahlen noch Listen sind, dann macht die Funktion einfach gar nichts, und gibt nur eine flache Kopie des Arguments zurück. Das erscheint mir komisch. Ich hätte da dann eher eine Ausnahme erwartet. `TypeError` zum Beispiel.
Unterm Strich erscheint mir das ziemlich viel Code für etwas das man auch so ausdrücken könnte:
Code: Alles auswählen
import numpy as np
def some_better_name(values):
return np.dot(values, -1)