Python: разбор математических выражений

Python: Итак, я работаю над программой (которая является заданием класса), которая будет принимать выражение, такое как 3/4/5 или 32432/23423/2354325 или 3425*343/254235 или 43252+34254-2435 и т. д. (для все операторы из +,-,/,*). и решит выражение.

Я НЕ МОГУ ИСПОЛЬЗОВАТЬ EVAL!!

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

http://docs.python.org/2/library/stdtypes.html#typesseq

Мой метод состоит в том, чтобы посмотреть на выражение, которое вводит пользователь, а затем использовать функцию поиска, чтобы найти ОПЕРАТОРЫ, а затем использовать эти операторы и функцию среза (например, s[0:x]). То, что у меня есть, приведено ниже, и, к сожалению, оно не работает: * обратите внимание, что операторы печати находятся там только для целей отладки. РЕДАКТИРОВАТЬ: почему x не определен, когда я запускаю программу и ввожу выражение?

z= (input("expression:")).strip()

def finding(z):
    if "/" in z:
        x=z.find("/")
        print("hi1")
    elif "*" in z:
        x=z.find("*")
        print("hi2")
    elif "+" in z:
        x=z.find("+")
        print("hi3")
    elif "-" in z:
        x=z.find("-")
        print("hi4")
    else:
        print("error, not math expression")
    return x

def Parsing(z,x):

    x= finding(z)
    qw=z.s[0:x]
    print (qw)
# take the x-value from function finding(z) and use it to split 

finding(z)
Parsing(z,x)

person SeesSound    schedule 30.10.2012    source источник
comment
@Blender Это совершенно другой метод, который я пробую, поэтому он в новых вопросах. Вы всегда можете посмотреть мой профиль и вопросы там, чтобы увидеть, что я уже спрашивал, прежде чем поставить мне -1. Я задал новый вопрос, потому что ответы, которые я получал, сильно расходились. Я спрашиваю что-то очень конкретное, и ответ на него не завершит мою домашнюю работу, поэтому я не задавал тот же вопрос повторно, чтобы кто-нибудь сделал мою домашнюю работу....   -  person SeesSound    schedule 30.10.2012
comment
@Blender По причинам, указанным выше, отмените отрицательный представитель. ты дал мне.   -  person SeesSound    schedule 30.10.2012
comment
@Blender В посте я указал, почему не могу использовать код. Никто больше не просматривает этот пост и никто больше не дает отзывов...   -  person SeesSound    schedule 30.10.2012
comment
Вы пытались изменить этот код в соответствии с вашими потребностями?   -  person Blender    schedule 30.10.2012
comment
@blender Да, у меня есть, но я не смог манипулировать им, и мне пришлось двигаться дальше, так как я не настолько продвинут и не полностью понял код в этом посте. Смешно обсуждать старую тему в новой... Я отредактировал свой пост. Если вы считаете этот вопрос списыванием моей домашней работы, то, увы, я не могу изучать информатику.   -  person SeesSound    schedule 30.10.2012
comment
Разве вы не задали этот вопрос вчера?   -  person Burhan Khalid    schedule 30.10.2012
comment
@BurhanKhalid Нет, конечно нет, совсем нет, отрицательно. Пожалуйста, посмотрите конкретно, что я прошу в этом посте. Кстати, вы так и не ответили на мой пост в своем ответе ...   -  person SeesSound    schedule 30.10.2012


Ответы (3)


Если у вас просто возникли проблемы с разделением ввода на части, вот что вам поможет. Я оставил его как можно более читабельным, чтобы вы могли хотя бы понять, что он делает. Я объясню любую часть этого, если вам нужно:

def parse(text):
    chunks = ['']

    for character in text:
        if character.isdigit():
            if chunks[-1].isdigit():   # If the last chunk is already a number
                chunks[-1] += character  # Add onto that number
            else:
                chunks.append(character) # Start a new number chunk
        elif character in '+-/*':
            chunks.append(character)  # This doesn't account for `1 ++ 2`.

    return chunks[1:]

Пример использования:

>>> parse('123 + 123')
['123', '+', '123']
>>> parse('123 + 123 / 123 + 123')
['123', '+', '123', '/', '123', '+', '123']

Я оставлю остальное на ваше усмотрение. Если вам не разрешено использовать .isdigit(), вам придется заменить его кодом Python более низкого уровня.

person Blender    schedule 30.10.2012
comment
Хорошо, лучше, чем моя попытка здесь - person Burhan Khalid; 30.10.2012
comment
@BurhanKhalid Это заполнитель в определении функции, которую я считаю. - person SeesSound; 30.10.2012
comment
@blender да, я могу использовать весь код. Я понимаю, что текст, скорее всего, является вводом вне определения функции. Я не понимаю, куда вписывается переменный символ. Он не определен в параметрах функции, но используется в аргументах. - person SeesSound; 30.10.2012
comment
character определяется в цикле for и цикле for. Посмотрите здесь: docs.python.org/2/tutorial/controlflow.html - person Blender; 30.10.2012
comment
О, я так привык видеть i вместо символа, что не осознавал... В любом случае, определение с веб-сайта документации по python создает двусмысленность... Я предполагаю, что character.isdigit() - это аргумент, который указывает что: если символ в тексте является числом, то перейдите к строке аргумента с отступом .... это правильное понимание isdigit? - person SeesSound; 30.10.2012
comment
@ user1716168: Это мог быть только я, но этот код не так уж далек от простого английского объяснения того, что вы будете делать. isdigit() возвращает True, если строка состоит только из цифр '1'.isdigit() == True. - person Blender; 30.10.2012
comment
Не могли бы вы присоединиться ко мне в чате? - person SeesSound; 30.10.2012
comment
@user1716168: Вы случайно удалили ссылку - person Blender; 30.10.2012
comment
Я никогда не давал ссылку... Я никогда не пользовался чатом на этом веб-сайте, но выше появилось приглашение с просьбой перенести разговоры в чат. Не могли бы вы дать ссылку на тот, в котором я могу присоединиться к вам. - person SeesSound; 30.10.2012
comment
О, подождите, видимо, мне нужно 20 повторений, которых у меня еще нет.. Вы используете что-то еще, чем хотите поделиться? IRC, PM, внешние мессенджеры? - person SeesSound; 30.10.2012
comment
@user1716168: Я немного увеличил вашу репутацию. См. ссылку выше. - person Blender; 30.10.2012
comment
Но я посмотрел на это достаточно, и это просто щелкнуло в моей голове. Пожалуйста, проверьте мое понимание, я начну с цикла for. Для символа в тексте, если символ является цифрой, и если последний фрагмент (последний символ?) был цифрой, то добавить следующий символ в тексте в фрагмент? Повторяйте это до тех пор, пока рассматриваемый символ не перестанет быть цифрой. Если это уже не цифра, перейдите к оператору elif, создайте там фрагмент, а затем вернитесь к исходному оператору if. Поскольку chunk[-1] больше не является оператором dgit, перейдите к оператору else и повторите. Правильно ли это? У меня есть несколько вопросов - person SeesSound; 30.10.2012

Я думаю, что проще всего это сделать с помощью алгоритма маневровой станции для преобразования ваше уравнение в постфиксной нотации, а затем выполнять его слева направо.

Но так как это классовое задание, вы должны сделать фактическую реализацию самостоятельно, я уже дал вам больше, чем должен был.

person wiill    schedule 30.10.2012
comment
Извините, это совсем не помогло. Пользователь привел мне конкретный пример в отношении вашего вышеуказанного метода, и я понял, что не могу использовать этот метод. - person SeesSound; 30.10.2012
comment
Так почему же вы не задали вопрос об этом методе и о том, с чем у вас возникли проблемы, вместо того, чтобы повторить весь свой вопрос снова? - person Burhan Khalid; 30.10.2012
comment
На самом деле он соответствует вашим потребностям, он соблюдает приоритет операций и не нуждается во внешних библиотеках, я знаю это, потому что раньше реализовывал это на Python в свободное время. - person wiill; 30.10.2012
comment
@BurhanKhalid Почему никто не понимает, что я несколько раз спрашивал сына о моем другом посте, и люди просто перестали копировать ... Что мне тогда делать? Проблема так и не была решена. Я уверен, что не в характере этого сайта оставлять вопрос без ответа. Конечно, по крайней мере один человек здесь будет утверждать, что я пытаюсь обмануть, что является ложью. - person SeesSound; 30.10.2012
comment
@wiill мой ОП не сказал, что я могу использовать какую-либо встроенную функцию. В нем говорилось, что я могу использовать любую встроенную функцию STRING... поэтому она мне не подходит. блин у меня так жарко... - person SeesSound; 30.10.2012
comment
Я сделал это с массивами, строками и строковыми встроенными функциями. Если вам не разрешено использовать массивы, я не вижу никаких проблем. Кроме того, не поймите неправильно, я просто пытаюсь показать вам, что мое решение не так сложно, и я думаю, что его стоит попробовать. Я мог бы вставить свой код завтра, если вы действительно хотите. Впрочем, не ждите ничего красивого, я сделал это на скорую руку. - person wiill; 30.10.2012
comment
Я не могу использовать массивы/списки. Пожалуйста, не публикуйте код, я хочу понять это сам, насколько это возможно. - person SeesSound; 30.10.2012
comment
Ну, это можно было бы сделать, используя только строки, но со списками было бы немного проще. Кроме того, я полностью согласен с тем, чтобы не публиковать код и позволить вам разобраться. - person wiill; 30.10.2012

Почему x не определен, когда я запускаю программу и ввожу выражение?

x не входит в область действия, вы определяете его только в своих методах и пытаетесь получить к нему доступ в другом месте.

z= (input("expression:")).strip()

def finding(z):
    # ... removed your code ...
    # in this method, you define x, which is local
    # to the method, nothing outside this method has
    # access to x
    return x

def Parsing(z,x):

    x= finding(z) # this is a different x that is assigned the 
                  # return value from the 'finding' method.
    qw=z.s[0:x] # I'm curious as to what is going on here.
    print (qw)
# take the x-value from function finding(z) and use it to split 

finding(z) # here, z is the value from the top of your code
Parsing(z,x) # here, x is not defined, which is where you get your error.

Поскольку Parsing уже вызывает finding для получения значения x, вам не нужно передавать его в Parsing, вам также не нужно вызывать finding(z) вне Parsing, так как вы нигде не сохраняете значение.

def Parsing(z):

    x= finding(z) # this is a different x that is assigned the 
                  # return value from the 'finding' method.
    qw=z.s[0:x] # I'm curious as to what is going on here.
    print (qw)
# take the x-value from function finding(z) and use it to split 

# finding(z)  -- not needed 
Parsing(z)
person Burhan Khalid    schedule 30.10.2012
comment
Как мне получить X, который находится в первой функции, во вторую функцию? - person SeesSound; 30.10.2012
comment
Поскольку вы вызываете первую функцию во второй функции и сохраняете результат x = finding(z), он уже есть во второй функции. - person Burhan Khalid; 30.10.2012