Мне кажется, вы запутались в строковом представлении объекта и самом объекте.
Короче: передайте фактический результат функции, а не его строковое представление:
mat = SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
SAES_FromStateMatrix(mat)
Объяснение
Когда вы вводите что-то в интерактивный интерпретатор Python (которым является среда sage, а также некоторые другие математические навороты), он оценивает введенное вами выражение Python и печатает строковое представление результата на приставка.
Так, например, если вы создаете словарь и просто вводите его имя, Python печатает строковое представление этого словаря:
>>> d = dict(foo=1, bar=2)
>>> d
{'foo': 1, 'bar': 2}
Это также называется циклом чтения-оценки-печати (REPL).
Теперь для словаря его строковое представление оказывается точно таким же, как и синтаксис литерального определения словаря ({key: value, ...}
. Подробнее о литералах см. ниже).
Однако это справедливо не для всех объектов. Для распространенных типов Python принято, что их строковое представление является чем-то, что при оценке в интерпретаторе Python воссоздает объект с тем же состоянием. Но это всего лишь соглашение, на которое нельзя положиться, и это просто невозможно для более сложных объектов. Например:
>>> class Foobar(object):
... def __init__(self):
... self.attr = 'foo'
...
>>> f = Foobar()
>>> f
<__main__.Foobar object at 0x109ee7750>
Здесь строковое представление экземпляров класса Foobar
равно <scope.Foobar object at memory_address>
. Что является строковым представлением по умолчанию для объектов.
Можно определить строковое представление, определив метод __repr__
:
>>> class Foobar(object):
... def __init__(self, value):
... self.value = value
... def __repr__(self):
... return '<Foobar instance with value=%s>' % self.value
...
>>> f = Foobar(42)
>>> f
<Foobar instance with value=42>
Итак, вы видите, __repr__
может возвращать что угодно - может быть допустимым выражением Python для воссоздания этого объекта или нет:
Для многих типов эта функция пытается вернуть строку, которая дала бы объект с тем же значением при передаче в eval()
, в противном случае представление представляет собой строку, заключенную в угловые скобки, содержащую имя типа объекта вместе с дополнительными информация, часто включающая название и адрес объекта.
Литералы
Для некоторых примитивных типов существуют так называемые литералы a> (специальные символы), которые являются способами (встроенными в синтаксис языка) для выражения общих типов данных.
Например:
Диктофоны
Форма для создания словаря с помощью конструктора dict()
:
>>> dict(foo=1, bar=2)
Форма для создания словаря с использованием литералов {
и }
:
>>> {'foo': 1, 'bar': 2}
Списки
>>> list((1, 2, 3))
против использования литералов [
и ]
:
>>> [1, 2, 3]
Мнимые числа
>>> 3.14j
Плавающие
>>> 3.14e-10
Итак, если вы снова введете {'foo': 1, 'bar': 2}
в интерпретатор и получите обратно dict, это сработает, потому что строковое представление словаря точно такое же, как буквальная форма для определения словаря.
Матрица мудреца
Теперь, в случае класса Matrix
мудреца, похоже, что строковое представление представляет собой некоторую математическую нотацию матрицы, но это не допустимое выражение Python. Как это могло произойти? a
не определен там, где речь идет о Python, поэтому, даже если бы это не было связано с недопустимым синтаксисом, ввод чего-то вроде [a^3 + a a^3 + a]
в Python вызовет NameError
, если только a
не было ранее определено с фактическим значением. Таким образом, вы также не можете вводить в Python алгебраические формулы, такие как x = 2 * y
, без фактического определения y
.
Что вам нужно сделать, так это передать фактическое возвращаемое значение SAES_ToStateMatrix(lst)
в SAES_FromStateMatrix()
. Например, сначала сохранив его во временной переменной:
mat = SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
SAES_FromStateMatrix(mat)
или передача результата функции напрямую, работает так же хорошо:
SAES_FromStateMatrix(SAES_ToStateMatrix([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))
person
Lukas Graf
schedule
26.10.2013
a a
вa^3 + a a^3 + a
не является допустимым выражением Python, это причина вашей синтаксической ошибки. - person Lukas Graf   schedule 26.10.2013SAES_ToStateMatrix
. - person Lukas Graf   schedule 26.10.2013it gives me..
, что именно вы имеете в виду? Судя по коду, функцияSAES_ToStateMatrix()
должна возвращать экземплярMatrix()
. Таким образом,[a^3 + a a^3 + a] [a^3 + a a^3 + a]
, вероятно, является строковым представлением (в математической нотации) этой матрицы, но не должно быть выражением Python. Так что передайте фактический матричный объект. - person Lukas Graf   schedule 26.10.2013# convert state matrix...
, больше не будет частью функцииSAES_FromStateMatrix
. - person Lukas Graf   schedule 26.10.2013