2016-10-03 37 views
0

我編碼在python簡單的離散系統的波紋管介紹:名單沒有負索引

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) 

階級制度旨在系統和方法動力學模型來計算通過離散時間動態系統演化。我認爲使用try/except結構來處理系統的第一步是一個好主意 - 在我們的例子中,前兩個步驟 - 在y的每個先前值中都不可用。那麼,如果列表對象不接受否定索引,這種方法就行得通了,但事實並非如此。我知道我可以用其他實現方法解決這個問題,但是我想繼續這個。所以,這是我的問題,我如何創建一個列表對象並禁用負向索引。我將不勝感激一些代碼。

感謝

+3

爲什麼要對抗語言?最好編寫符合語言的代碼,而不是將語言扭曲以適應代碼。 – Meerness

+0

創建一些東西只是爲了讓它在'try except'塊中工作不是一個好主意。想象一下,你是Guido,你正在爲用戶設計一種語法來輕鬆處理代碼中的錯誤,並且人們開始創建'type'來處理這種語法。你覺得如何 ? – Rockybilly

+0

@Rockybilly他可能會很高興元編程使他的工具更有用。看到例如django。 – tdelaney

回答

1

雖然我在評論中指出我的不情願,我要玩你的遊戲。

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

您還需要檢查索引,因爲切片還使用'__getitem__'(以'slice'對象作爲索引)。 – Blckknght

+0

@Blckknght你說得對,但是,OP似乎並不需要它在代碼的特定部分。 – Rockybilly

+0

哦,我想切片實際上是在Python 2中巧合運行的,其中切片的比較大於整數。在Python 3中比較它們是一個錯誤。 – Blckknght

1

這就是你真正想要的,更清潔。只需將最新的兩個y值保存在額外的變量中。

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)