2015-12-25 1 views
0

Я в процессе создания программы для своего класса линейной алгебры с векторными и матричными классами, но у меня возникают проблемы с строкой моего класса матрицы для ее печати. Что вызывает проблему, это оператор if, который добавляет запятую после записи в матрицу, если она не является последней строкой в ​​строке. Что любопытно об этом, я выделил проблему для той части моей программы, которая присваивает переменную индексу записи, но когда я добавил строку после этого, которая напечатала эту переменную, чтобы попытаться выяснить, что происходит , запустив программу, напечатал переменную AND THEN, дал ошибку из строки раньше. Вот код:Программа Python продолжает работать после столкновения с ошибкой

import copy 
class vector: 

    def __init__(self, entries): 
     if type(entries) == list: 

      self.elements = [] 
      self.dimensionality = len(entries) 
      for entry in entries: 
       self.elements.append(entry) 
     if type(entries) == vector: 
      self.elements = entries.elements 

    def __str__(self): 
     buff = "(" 
     for e in self.elements: 
      buff += str(e) 
      if self.elements.index(e) < len(self.elements) - 1: 
       buff += ", " 
     buff += ")" 
     return buff 
    def __getitem__(self,index): 
     return self.elements[index] 

    def __len__(self): 
     return len(self.elements) 

    def __mul__(self, otherVector): 
     if self.dimensionality != otherVector.dimensionality: 
      raise RuntimeError("Cannot multiply vectors of different dimensions") 
     else: 
      product = 0 
      for e in self.elements: 
       product += e * otherVector.elements[self.elements.index(e)] 
      return product 

    def __eq__(self, otherVariable): 
     return size(self) == size(otherVariable) 

    def size(x): 
     return (x * x)**(1/2) 



class matrix: 
    def __init__(self, entries): 
     for i in entries: 
      if len(entries[0]) != len(i): 
       raise RuntimeError("All rows of matrix must contain the same number of entries") 
     self.elements = [] 
     for row in entries: 
      self.elements.append(vector(row)) 
    def __str__(self): 
     buff = "(" 
     for row in self.elements: 
      buff += str(row) 
      a = self.elements.index(row) #this is the line that prompts the error 
      b = len(self.elements) - 1 
      print (a)      #but this line executes before the error cuts off the rest of the program 
      print(b) 
      print(a<b) 
      if a < b : 
       buff += ", " 
     buff += ")" 
     return buff 

print(matrix([[1,2],[2,3]])) 

и вот ошибка это дает мне:

Traceback (most recent call last): 
    File "/Users/sebpole/Documents/vectors.py", line 127, in <module> 
    print(matrix([[1,2],[2,3]])) 
    File "/Users/sebpole/Documents/vectors.py", line 83, in __str__ 
    a = self.elements.index(row) 
    File "/Users/sebpole/Documents/vectors.py", line 38, in __eq__ 
    return size(self) == size(otherVariable) 
NameError: name 'size' is not defined 

Я установил эту конкретную ошибку, пропуская определение функции «размер()» и просто писать его на определение векторного равенства. Так как это было непродолжительное, это не было проблемой, и после этой настройки программа отлично справилась, но у меня есть следующие два концептуальных вопроса: 1) Что происходит с линией после ошибки, выполнявшейся до того, как произошла ошибка? 2) В чем была проблема? Почему у программы возникла проблема с вызовом функции, которую я определил немного позже? Почему при определении индекса строки матрицы вывести определение равенства для этой строки (вектора)?

ответ

0

Использование self.save для обозначения функции, определенной в классе

+0

Вы могли бы показать мне, как конкретно? Где я могу вставить это? –

+0

Пожалуйста, подумайте над редактированием сообщения, чтобы добавить больше объяснений о том, что делает ваш код и почему он решит проблему. Ответ, который в основном содержит только код (даже если он работает), обычно не помогает OP понять их проблему. – Drenmi

0

ошибка исходит от вызова print в строке 127, и вся линия не выполняется. Вы действительно видели печатный результат в консоли, кроме трассировки стека?

Концептуально, то строка, print(matrix([[1,2],[2,3]])) делает это:

  • экземпляр matrix создан успешно
  • print звонки __str__ на этом matrix например
  • __str__ вызовы index в списке vector экземпляров
  • index необходимо просмотреть список, чтобы найти матч ING значения и вызывает __eq__ на каждый члене списка, чтобы найти матч
  • исходного __eq__ код вызывает недостающий функция с именем size (вы заметили, и фиксированный)

Я удивлен, что это произвело любого вывода, кроме ошибки.

+0

«0 Правда Traceback (самый последний вызов последнего): Файл "/Users/sebpole/Documents/vectors.py", строка 163, в печати (матрица ([[1,2], [2 , 3]])) Файл «/Users/sebpole/Documents/vectors.py», строка 100, в __str__ a = self.elements.index (строка) Файл «/ Пользователи/sebpole/Documents/vectors.py ", строка 47, в __eq__ return size (self) == size (otherVariable) NameError: name 'size' не определен 'это то, что он сделал, когда я запустил его, что, как видите, запускает строку после error ... –

+0

В вашем примере есть только одна строка процедурного кода ('print (matrix ([[1,2], [2,3]]))). Я вижу, что строка создает ошибку. line после ошибки вы видите? – pneumatics

+0

Да, но эта строка вызывает функцию, и ошибка возникает в функции. Я имею в виду, что происходит в функции. –