Я пишу объект калькулятора, который оценивает строки, соответствующие int / float и операторам в «() * / +». Приведенные ниже функции берут список элементов, сформированный из строки, содержащей только целые числа / числа с плавающей запятой и операторы одного и того же ранга (здесь * и /), и оценивают выражение слева направо до тех пор, пока не останется больше операторов.
def execute(s):
while "*" in s or "/" in s:
temp = []
for i in range(len(s)):
if s[i] == "*" or s[i] == "/":
res = perform(s[i-1], s[i], s[i+1])
del temp[-1]
temp.append(res)
for e in s[i+2:]:
temp.append(e)
s = temp
break
else:
temp.append(s[i])
return s
def execute1(s):
while len(s) > 1:
while "*" in s or "/" in s:
for i in range(len(s)):
if s[i] == "*" or s[i] == "/":
res = perform(s[i-1], s[i], s[i+1])
s[i-1:i+2] = [None, None, res]
s = [e for e in s if e != None]
return s
Первая функция не изменяет список на месте (что, как я узнал, является плохой практикой), но работает медленнее, чем вторая функция (потому что она должна выполнить количество проходов по списку, равное числу операций) и использует больше памяти (поскольку temp создается и изменяется во время каждого прохода).
Есть ли способ сделать это, чтобы не изменять список на месте и выполнять оценку только за один проход?