Импорт переменной в Python?

Я использую sympy для написания надстрочного индекса с помощью команды pretty_print. Это необходимо импортировать вместе с некоторыми переменными (алгебра (x, y и т. д.)) для того, чтобы команда pretty_print работала. Если вы не импортируете переменные (алгебру) из sympy.abc, вам нужно будет поместить буквы в кавычки '', в которых команда pretty_print не будет работать.

Так, например, если я печатаю на экране, мне нужно импортировать x, чтобы его можно было использовать в программе. Как это:

import sympy  
from sympy import pretty_text as exp   
from sympy.abc import x

equation= x**2

exp(equation)

Это напечатает x² на экране. Проблема в том, что если я присвою значение x, то оно больше не будет равно самому себе. Если я печатаю x сразу после импорта из sympy.abc, он делает это:

(притворяясь, что это IDLE) >

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 

однако, если сделать x 1

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 
>>> x = 1
>>>x
1

Затем мне нужно снова возвести в квадрат x,

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 
>>> x = 1
>>>x
1 
>>> equation = x**2
>>> exp(equation)
1

Это будет просто квадрат 1. Даже если он снова попытается сделать x = 'x', это не то же самое, так как вокруг него будет ''. Я могу исправить это, только импортировав его снова. Однако в моей программе мне может понадобиться снова импортировать любую букву, поэтому мне нужно будет импортировать переменную. Я старался

from sympy.abc import x[0]

Но это недействительно. Итак, есть ли способ импортировать разные буквы?


person Nick    schedule 08.02.2013    source источник
comment
Помещение x в кавычки создает строку, которая является полностью отдельным объектом от символа.   -  person asmeurer    schedule 08.02.2013
comment
В вашем вопросе много заблуждений. Прочтите docs.sympy.org/0.7.2/gotchas.html и посмотрите, прояснит ли это некоторые вещи (особенно раздел переменных).   -  person asmeurer    schedule 08.02.2013


Ответы (3)


Если вы хотите сохранить символы, не присваивайте им никаких значений — продолжайте использовать символы, пока вам действительно не понадобится решение.

Например:

In [15]: equation=sympy.sin(x**2)

In [16]: exp(equation)
   ⎛ 2⎞
sin⎝x ⎠

In [17]: result = equation.subs({'x': 2})

In [18]: result
Out[18]: sin(4)

In [19]: result.evalf()
Out[19]: -0.756802495307928

Это не меняет самого x - позже:

In [23]: exp(sympy.log(x**.5))
   ⎛ 0.5⎞
log⎝x   ⎠

Сохраняйте свои уравнения в символической форме столько, сколько необходимо, и не беспокойтесь о самих значениях.

person viraptor    schedule 08.02.2013

Вам не нужно импортировать имена символов в SymPy. Модуль abc предназначен только для удобства однобуквенных имен символов.

Просто создайте объект Symbol с любым именем (это может быть любая строка, в том числе созданная динамически).

>>> x = Symbol('x')
>>> x
x

Также обратите внимание, что имя, которое вы даете символу, и имя переменной Python, содержащей этот символ, не обязательно должны быть связаны. Действительно, Symbol понятия не имеет, с какими именами переменных Python он связан (так все работает в Python, а не только в SymPy).

>>> x = Symbol('y')
>>> x
y 

Вы также можете использовать symbols для одновременного создания нескольких символов.

>>> x, y, z = symbols('x y z')
person asmeurer    schedule 08.02.2013
comment
Эта команда импортирована из sympy? Когда я импортировал его из sympy и попробовал это, я получил сообщение об ошибке, говорящее, что объект не может быть вызван. - person Nick; 12.02.2013
comment
Да, Symbol и symbols оба импортированы из SymPy. - person asmeurer; 12.02.2013

Если вы вместо этого сделаете:

import sympy.abc
x = sympy.abc.x

Затем, когда вам нужно исходное значение, просто используйте sympy.abc.x. Если вам нужно динамически получить имя:

getattr(sympy.abc, "x")

Где литерал можно заменить любой переменной.

person Gareth Latty    schedule 08.02.2013
comment
Я понимаю вашу первую часть с использованием x = sympy.abc.x , но не могли бы вы объяснить getattr(sympy.abc, x), как мне использовать это с переменной? - person Nick; 08.02.2013
comment
@Nick getattr() - это встроенная функция, которая получает атрибут от объекта, поэтому, если у вас есть экземпляр класса с атрибутом name, inst.name точно эквивалентен getattr(inst, "name") - модули работают одинаково. getattr(sympy.abc, "x") — это еще один способ записи sympy.abc.x, за исключением того, что "x" может быть любой переменной, что позволяет динамически получать различные атрибуты. - person Gareth Latty; 08.02.2013
comment
я попытался проверить это, и когда я попытался сделать x переменной, он сказал, что атрибут должен быть строкой. Итак, как я могу изменить букву, которую я хочу динамически импортировать, используя это? - person Nick; 08.02.2013
comment
@Nick Переменная должна содержать имя переменной, которую вы хотите импортировать, поэтому, если вы хотите импортировать переменную sympy.abc.z, переменная, которую вы передаете getattr(), должна содержать значение 'z'. - person Gareth Latty; 08.02.2013
comment
Почему я получил за это -1? - person Gareth Latty; 08.02.2013
comment
Я не поставил вам оценку 1. Я пытаюсь сказать, что пользователь программы вводит уравнение, и оно будет прочитано моей программой. Поскольку я не знаю точных букв, которые будут иметь уравнение, я буду использовать переменную a для представления буквы, а затем импортировать букву, которую представляет a. Я не говорю о буквах переменных алгебры, мне нужно ввести букву, которая неизвестна в виде переменной python. - person Nick; 09.02.2013
comment
Да, это то, что getattr() сделает для вас. Если a — это переменная, представляющая букву для импорта, то getattr(module, a) даст вам значение module.whatever_is_in_a. - person Gareth Latty; 09.02.2013
comment
››› import sympy ››› import sympy.abc ››› from sympy.abc import r ››› a= r ››› getattr (sympy.abc, a) Трассировка (последний последний вызов): Файл ‹pyshell# 11›, строка 1, в ‹module› getattr (sympy.abc, a) TypeError: getattr(): имя атрибута должно быть строкой ››› - person Nick; 09.02.2013
comment
Вы присваиваете a значение r. Если вы хотите получить r к его начальному значению, вы можете просто r = a позже (при условии, что вы не измените a. Если вы хотите снова импортировать его, как вы предложили в своих примерах с помощью моего метода, вам нужно использовать 'r' как значение. - person Gareth Latty; 09.02.2013
comment
Это сработало бы, если бы я переназначал значение, но теперь вопрос в том, как узнать, какую букву мне нужно импортировать, если пользователь вообще мог ввести любую букву? Скажем, буква в очереди находится на входе [3], я бы установил для ввода [3] переменную, var = input [3], тогда мне нужно ввести эту букву, как мне это сделать? - person Nick; 10.02.2013
comment
@Nick Вы не совсем понимаете, что вы хотите сделать, можете ли вы привести несколько примеров в виде ввода/вывода того, что вам нужно сделать. - person Gareth Latty; 10.02.2013
comment
Что ж, моя программа позволит пользователю ввести квадратное уравнение, которое необходимо разложить на множители, а затем программа выведет решения уравнения. Поскольку квадратные уравнения всегда имеют переменную в квадрате, мне нужно будет иметь возможность формально напечатать эту переменную в квадрате. - person Nick; 10.02.2013
comment
Я проголосовал против по нескольким причинам: 1. Ваше предложение будет работать только для однобуквенных имен переменных (и греческих букв), так как это все, что есть в abc. 2. Даже для них это слишком запутанно. Просто создайте экземпляр Symbol. Смотрите мой ответ. 3. Вы предполагаете, что import sympy.abc; x = sympy.abc.x и from sympy.abc import x чем-то отличаются. Они точно такие же. 4. Это не устраняет какую-либо путаницу или плохой дизайн кода, присутствующие в вопросе (а скорее предлагает неправильные вещи и дает более непитоновский код). - person asmeurer; 10.02.2013
comment
@asmeurer Я предлагал решение, не зная библиотеки под рукой. Хотя мой ответ может быть не лучшим решением, учитывая эти знания, это правильный ответ на то, что, казалось, спрашивал ОП. В ответ на 3 они разные. Один назначает модуль sympy.abc, что позволяет легко получить доступ к модулю в будущем, другой - нет. - person Gareth Latty; 11.02.2013