Как изменить операцию в python с вводом?

Я пытаюсь работать над графическим калькулятором в Python, используя Numpy и Matplotlib. Вот мой код:

import numpy as np
import matplotlib.pyplot as plt

a = input("enter operation")
#operation can be something like '**2 or + 1'
b = np.arange(1,10)
#here is where i am stuck. 

Как вы добавляете ввод a в массив numpy b?

Мне нужен другой метод, кроме eval. Все другие проекты, которые люди показали мне, используют eval.


person Abhiraam Eranti    schedule 31.07.2018    source источник
comment
Я предлагаю вам потратить некоторое время, чтобы узнать о синтаксическом анализе строк.   -  person Code-Apprentice    schedule 31.07.2018
comment
Существует много существующих дубликатов, поиск по математическому выражению и функция eval (хотя это имеет проблемы с безопасностью). Вот некоторые из них: вычисление математического выражения, оператор python if с переменным математическим оператором, eval() с переменным оператором...   -  person smci    schedule 31.07.2018
comment
Это должно быть закрыто как дубликат. Из какого вопроса?   -  person smci    schedule 31.07.2018


Ответы (2)


Вы хотите применить операцию ввода к каждому значению b? если это так, это может работать для вас, но я предлагаю вам четко указать, какие операции разрешены, и сделать проверку с помощью регулярного выражения, потому что «eval» будет запускать любые коды, которые вводят пользователи, что может быть довольно опасно.

import numpy as np
import matplotlib.pyplot as plt

In [4]: import numpy as np
   ...: a = input("enter operation\n")
   ...: #operation can be something like '**2 or + 1'
   ...: b = np.arange(1,10)
   ...: #here is where i am stuck.
   ...: func_str = 'lambda x:x ' + a
   ...: func = eval(func_str)
   ...: func_vect = np.vectorize(func)
   ...: result = func_vect(b)
   ...:
   ...:
enter operation
**2

In [5]: result
Out[5]: array([ 1,  4,  9, 16, 25, 36, 49, 64, 81])
person Woods Chen    schedule 31.07.2018

Почему бы тебе просто не

import numpy as np

a = input("enter operation")
# operation can be something like '**2 or + 1'
b = np.arange(1, 10)
np.append(b, a)
# here is where i am stuck.

Я уловил твое намерение?

Или вы можете попробовать это.

while True:
    a = input("enter operation")
    b = np.arange(1, 10)
    operator, = re.compile(r'([*+/-]+)').findall(a)
    num, = re.compile(r'([.0-9]+)').findall(a)
    print(operator, num)
    result = None
    if operator == '+':
        result = b + float(num)
    elif operator == '-':
        result = b - float(num)
    elif operator == '**':
        result = b ** float(num)
    print(result)

где пакет re используется для манипуляций со строками. Если вы введете +2, ко всем компонентам b будет добавлено 2, чтобы получить result. Точно так же, если вы наберете **2, вы получите квадраты b.

person Hermis14    schedule 31.07.2018