Найти - Пользователи
Полная версия: Сочетание символов, как задать операторы.
Начало » Python для новичков » Сочетание символов, как задать операторы.
1 2 3
Alex_Kutsan
ах да и ещё если посмотреть в мой код например сюда
for simv in n:
for chya in ch:
for operator in operators:
то можно увидеть что для состыковки каждого из разных списков я делаю каждый раз вложеные функции
Ещё ничего когда их 2
Но вотя наткнулся на проблему когда их 4, и по 2-5 переменных в каждом списке, и программа моя будет естетвенно плоховато работать. Да и по индусски жто както.

А проблема у меня такая
что напимер символ n должен ровнятся хоть какойто переменной из этого сиска
если использовать такой синтаксис n==
то то что мне нужно будет выглядить так

tf = True
if n==:
tf = False
но такого в питоне я не знаю. Подскажите может есть функция покомпактнее которая сравнивает 1 переменную с каждой переменой в списке,
Ато по 5 вложеных циклов это слишком
bazooka
>>> n = 1
>>> if n in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
print('счастье и радость!')


счастье и радость!
Alex_Kutsan
О госоди, я написал маленькую Часть кода, И в нём ошибка, я не могу найти какая!!
Помогите
n= "(((!x)>x)_((!y)=(!x)))" # Юзер задал какуюто функцию
ch=["x","y"] # программа должна определить переменные (я ещё не придумал функциии но помойму это не сложно)
operatorsNO = [">","<","=","_","&"] # я задал операторы включаа яоператор НЕТ
operators = [">","<","=","_"] # я задал опрераторы без оператора НЕТ
# мне надо сделать так чтоб после переменной небыло открывающейся скобки, другой переменой или оператора НЕ,
# ещё нужно чтобы перед переменной небыло закрывающейся скобки или другой переменной
# НУ И 3 это чтоб если до переменной стоит оператор, то после неё опрератора быть уже не может
# ну и наоборот, если после переменной стоит опрератор то до переменной оператора быть не может
for simv in n:
for chya in ch:
for operator in operators: # таким способом будут состыковыватся все виды символов
for operatorNO in operatorsNO:
if simv == chya: # я нашел переменную в строке
t=0
while t<len(n):
if n[t]==simv:
q=t
break # я определил номер переменной в строке
t=t+1
if n[q+1]== "(" or n[q+1]=="&": # после переменной небыло открывающейся скобки или оператора НЕ,
tf = False
if n[q-1]==")": # перед переменной небыло закрывающейся скобки
tf = False
if n[q+1]==operator: # если после переменной стоит опрератор то до переменной оператора быть не может
if n[q-1]==operatorNO:
tf = False
if n[q-1]==operator: # если до переменной стоит оператор, то после неё опрератора быть уже не может
if n[q+1]==operatorNO:
tf = False
к стати я совсем забыл выпонить в коде условие что 2 переменные не могут ити подряд, но неужели для этого прийдётся делать 4 вложеный цикл?
Alex_Kutsan
Ой да я введь забыл написать его выполнение
>>>n = "(((!x)>x_)_((!y)=(!x)))" # тут ошибка в этом месте >x_ , если до переменой стоит оператор, то после неё уже не может,и наоборот.
tf = True
>>> for simv in n:
for chya in ch:
for operator in operators:
for operatorNO in operatorsNO:
if simv == chya:
t=0
while t<len(n):
if n[t]==simv:
q=t
break
t=t+1
if n[q+1]== "(" or n[q+1]=="&":
tf = False
if n[q-1]==")":
tf = False
if n[q+1]==operator:
if n[q-1]==operatorNO:
tf = False
if n[q-1]==operator:
if n[q+1]==operatorNO:
tf = False


>>> tf
True
как видно я вставил в свою функцию ошибочные данные , а программа эти данные пропустила, и сказала что они правдивые
rerednaW
Все равно, от грамматического разбора в том или ином виде не уйти. Даже если вы студент. Представьте что то что у вас есть - это некий входной язык с определенным синтаксисом. Остается разобрать на отдельные операторы и применить их. Если не хочется идти таким путем, можно попробовать заточить язык перегрузив операторы. Такое можно проделать, например, на C++.
Alex_Kutsan
Эммм….
Ок не не пытаюсь уйти от каких либо трудностей,
только я не знаю C++ , я знаю только немного Азы Питона, а за неделю c++ мнене выучить,
к тому же есть ещё много работы помимо этой.
Так как ведь вроде этим я и занимаюсь, я делаю граматический разбор.
только как я понимаю индусским методом.
Скажте как сделать по другому?
tombird
http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C

Ctrl-F “Преобразование из инфиксной нотации”
rerednaW
Alex_Kutsan
Эммм….
Ок не не пытаюсь уйти от каких либо трудностей,
только я не знаю C++ , я знаю только немного Азы Питона, а за неделю c++ мнене выучить,
к тому же есть ещё много работы помимо этой.
Так как ведь вроде этим я и занимаюсь, я делаю граматический разбор.
только как я понимаю индусским методом.
Скажте как сделать по другому?
В другой теме я уже давал ссылку на пример с PLY. Если это не нравится, можно попробовать описать это самому. В начале описать требуемую грамматику в виде то го же БНФ. Потом выделить лексические конструкции. На их базе написать собственно разборщик. На Питоне это пищется легче, так как можно смело использовать рекурсию и готовые элементы типа списка или словаря для хранения промежуточных результатов.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB