2016-10-03 5 views
0

ich einfach diskretes Systems in Python bin Codierung, die unten dargestellt:Liste ohne negative Indizierung

class System: 
    def __init__(self, a, b): 
    self.a = a 
    self.b = b 
    self.y = [] 


    def dynamics(self, signal): 
    for i in range(len(signal)): 
     try: 
     self.y.append(signal[i] - self.a*self.y[i-1] - self.b*self.y[i-2]) 
     except: 
     try: 
      self.y.append(signal[i] - self.a*self.y[i-1] - self.b*0) 
     except: 
      self.y.append(signal[i] - self.a*0 - self.b*0) 

Das Klasse-System zielt darauf ab, das System und die Methode Dynamik zu modellieren die dynamische System Evolution durch diskrete Zeit zu berechnen. Ich dachte, dass es eine gute Idee wäre, die try/except-Struktur zu verwenden, um mit den ersten Schritten des Systems fertig zu werden - in unserem Fall die ersten beiden Schritte - in jedem der vorherigen Werte von y wäre nicht verfügbar. Nun, dieser Ansatz würde funktionieren, wenn das Listenobjekt keinen negativen Index akzeptiert, was nicht der Fall ist. Ich weiß, dass ich dieses Problem mit anderen Implementierungsansätzen lösen könnte, aber ich möchte damit fortfahren. Also, das ist meine Frage, wie könnte ich ein Listenobjekt erstellen und negative Indizierung deaktivieren. Ich würde einige Codeabschnitte schätzen.

Dank

+3

Warum die Sprache bekämpfen? Es ist besser, einen Code zu schreiben, der der Sprache entspricht, als die Sprache an den Code anzupassen. – Meerness

+0

Etwas zu erstellen, nur um es in einem 'try except'-Block arbeiten zu lassen, ist keine gute Idee. Stellen Sie sich vor, Sie sind Guido, Sie entwerfen eine Syntax für Benutzer, um Fehler in ihrem Code leicht zu handhaben, und Leute fangen an, Typen zu schaffen, um mit dieser Syntax zu arbeiten. Wie würdest du dich fühlen ? – Rockybilly

+0

@Rockybilly er könnte sich freuen, dass Meta-Programmierung sein Werkzeug nützlicher gemacht. Siehe zum Beispiel django. – tdelaney

Antwort

1

Obwohl ich meine Abneigung in den Kommentaren darauf hingewiesen, werde ich dein Spiel spielen.

class PositiveList(list): 

    def __getitem__(self, ind): 
     if ind < 0: 
      raise IndexError("Expected a positive index, instead got {}.".format(ind)) 
     return super(PositiveList, self).__getitem__(ind) 

x = PositiveList([1, 2, 3]) 
print x[-1] 
#IndexError: Expected a positive index, instead got -1. 
+0

Sie müssen auch den Index checken, da das Slicing auch '__getitem__' verwendet (mit einem' slice' Objekt als Index). – Blckknght

+0

@Blckknght Sie haben Recht, aber OP scheint es nicht in diesem bestimmten Teil des Codes zu brauchen. – Rockybilly

+0

Oh, ich denke, Slicing funktioniert in Python 2 zufällig, wo Slices größer als ganze Zahlen sind. In Python 3 ist es ein Fehler, sie zu vergleichen. – Blckknght

1

Dies tut, was Sie eigentlich wollen und ist viel sauberer. Behalte einfach die letzten zwei y-Werte in zusätzlichen Variablen.

def dynamics(self, signal): 
    y1 = y2 = 0 
    for sig in signal: 
     y1, y2 = sig - self.a * y1 - self.b * y2, y1 
     self.y.append(y1)