From ede3ae0025a7a710cf3e0435f71be9eb76bed1b9 Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Wed, 7 Nov 2018 23:03:15 +0300 Subject: [PATCH 1/7] changes --- final_task/setup.py | 132 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/final_task/setup.py b/final_task/setup.py index e69de29..4f680ef 100644 --- a/final_task/setup.py +++ b/final_task/setup.py @@ -0,0 +1,132 @@ +import operator +import math + +OPERATORS = {'+': operator.add, + '-': operator.sub, + '*': operator.mul, + '/': operator.truediv, + '^': operator.pow, + '%': operator.mod } + +FUNCTIONS = ['abs', + 'sin', + 'cos', + 'log10', + 'log'] + + +def searchFunc(expr): + if symbol in FUNCTIONS: + start = expr.find(symbol) + if start != -1: + start = start+len(symbol)+1 + newExpr = expr[start:] + bracketsAmount=0 + for i in newExpr: + if i == '(': + bracketsAmount+=1 + elif i == ')' and bracketsAmount != 0: + bracketsAmount-=1 + elif i == ')': + break + count+=1 + newExpr = newExpr[:count] + searchFunc(newExpr) + else + +def checkBrackets(expression): + bracketsAmount=0 + for symbol in expression: + if bracketsAmount==-1: + return False + if symbol == '(': + bracketsAmount+=1 + elif symbol == ')': + bracketsAmount-=1 + if bracketsAmount!=0: + return False + return True + +def allowedNums(): + return '0123456789.' + +def convertExpr(expr): + iter = 0 + i = 0 + out = '' + for symbol in expr: + if symbol == '-' and iter == 0: + out += symbol + elif symbol in allowedNums(): + out += symbol + iter+=1 + elif symbol in OPERATORS: + out += ' %s ' % (symbol) + iter+=1 + if symbol == ')' and len(expr) == i+1: + out += ' )' + iter=0 + elif symbol == ')' and expr[i+1] in allowedNums(): + out += ' ) * ' + iter+=1 + elif symbol == ')' : + out += ' )' + iter+=1 + if symbol == '(' and iter == 0: + out += '( ' + iter=0 + elif symbol == '(' and expr[i-1] in allowedNums(): + out += ' * ( ' + iter=0 + elif symbol == '(' and expr[i-1] == ')': + out += ' * ( ' + iter=0 + elif symbol == '(': + out += '( ' + iter=0 + i+=1 + return out.strip() + + +def pycalc(expr): + stack = [0] + for token in expr.split(' '): + if token in OPERATORS: + op2, op1 = stack.pop(), stack.pop() + stack.append(OPERATORS[token](op1,op2)) + elif token: + stack.append(float(token)) + return stack.pop() + +def RevPolNot(expr): + operators = {'+': 1, + '-': 1, + '*': 2, + '/': 2, + '^': 3, + '%': 2} + RevPN = [] + stack = [''] + for token in expr.split(' '): + if token in operators: + op = stack.pop() + if op == '' or op == '(': + stack.append(op) + stack.append(token) + elif operators[token] <= operators[op]: + stack.append(token) + RevPN.append(op) + elif operators[token] > operators[op]: + stack.append(op) + stack.append(token) + elif token == '(': + stack.append(token) + elif token == ')': + op = stack.pop() + while not op == '(': + RevPN.append(op) + op = stack.pop() + else: RevPN.append(token) + while stack: + RevPN.append(stack.pop()) + return ' '.join(RevPN) From d4af8ebfc0d36b16bd80b7114d812368bc64a40b Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Wed, 7 Nov 2018 23:12:38 +0300 Subject: [PATCH 2/7] changes --- final_task/setup.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/final_task/setup.py b/final_task/setup.py index 4f680ef..1cdf8dc 100644 --- a/final_task/setup.py +++ b/final_task/setup.py @@ -8,14 +8,7 @@ '^': operator.pow, '%': operator.mod } -FUNCTIONS = ['abs', - 'sin', - 'cos', - 'log10', - 'log'] - - -def searchFunc(expr): +'''def searchFunc(expr): if symbol in FUNCTIONS: start = expr.find(symbol) if start != -1: @@ -32,7 +25,7 @@ def searchFunc(expr): count+=1 newExpr = newExpr[:count] searchFunc(newExpr) - else + else ''' def checkBrackets(expression): bracketsAmount=0 @@ -89,6 +82,7 @@ def convertExpr(expr): def pycalc(expr): + expr=RevPolNot(convertExpr(expr)) stack = [0] for token in expr.split(' '): if token in OPERATORS: From a8754ece14c389fd64bbc406e81a0759a8d5791c Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Mon, 12 Nov 2018 22:50:00 +0300 Subject: [PATCH 3/7] changes --- final_task/pycalc/__init__.py | 0 final_task/pycalc/pycalc.py | 143 ++++++++++++++++++++++++++++++++++ final_task/setup.py | 136 +++----------------------------- 3 files changed, 153 insertions(+), 126 deletions(-) create mode 100644 final_task/pycalc/__init__.py create mode 100644 final_task/pycalc/pycalc.py diff --git a/final_task/pycalc/__init__.py b/final_task/pycalc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/final_task/pycalc/pycalc.py b/final_task/pycalc/pycalc.py new file mode 100644 index 0000000..6edbea4 --- /dev/null +++ b/final_task/pycalc/pycalc.py @@ -0,0 +1,143 @@ +import operator +import math + +OPERATORS = {'+': operator.add, + '-': operator.sub, + '*': operator.mul, + '/': operator.truediv, + '^': operator.pow, + '%': operator.mod } + +FUNCTIONS = ['abs', + 'sin', + 'cos', + 'log10', + 'log'] + + +def searchFunc(expr): + if symbol in FUNCTIONS: + start = expr.find(symbol) + if start != -1: + start = start+len(symbol)+1 + newExpr = expr[start:] + bracketsAmount=0 + for i in newExpr: + if i == '(': + bracketsAmount+=1 + elif i == ')' and bracketsAmount != 0: + bracketsAmount-=1 + elif i == ')': + break + count+=1 + newExpr = newExpr[:count] + searchFunc(newExpr) + else + +def checkBrackets(expression): + bracketsAmount=0 + for symbol in expression: + if bracketsAmount==-1: + return False + if symbol == '(': + bracketsAmount+=1 + elif symbol == ')': + bracketsAmount-=1 + if bracketsAmount!=0: + return False + return True + +def allowedNums(): + return '0123456789.' + +def convertExpr(expr): + iter = 0 + i = 0 + out = '' + for symbol in expr: + if symbol == '-' and iter == 0: + out += symbol + elif symbol in allowedNums(): + out += symbol + iter+=1 + elif symbol in OPERATORS: + out += ' %s ' % (symbol) + iter+=1 + if symbol == ')' and len(expr) == i+1: + out += ' )' + iter=0 + elif symbol == ')' and expr[i+1] in allowedNums(): + out += ' ) * ' + iter+=1 + elif symbol == ')' : + out += ' )' + iter+=1 + if symbol == '(' and iter == 0: + out += '( ' + iter=0 + elif symbol == '(' and expr[i-1] in allowedNums(): + out += ' * ( ' + iter=0 + elif symbol == '(' and expr[i-1] == ')': + out += ' * ( ' + iter=0 + elif symbol == '(': + out += '( ' + iter=0 + i+=1 + return out.strip() + + +def calc(expr): + stack = [0] + for token in expr.split(' '): + if token in OPERATORS: + op2, op1 = stack.pop(), stack.pop() + stack.append(OPERATORS[token](op1,op2)) + elif token: + stack.append(float(token)) + return stack.pop() + +def RevPolNot(expr): + operators = {'+': 1, + '-': 1, + '*': 2, + '/': 2, + '^': 3, + '%': 2} + RevPN = [] + stack = [''] + for token in expr.split(' '): + if token in operators: + op = stack.pop() + if op == '' or op == '(': + stack.append(op) + stack.append(token) + elif operators[token] <= operators[op]: + stack.append(token) + RevPN.append(op) + elif operators[token] > operators[op]: + stack.append(op) + stack.append(token) + elif token == '(': + stack.append(token) + elif token == ')': + op = stack.pop() + while not op == '(': + RevPN.append(op) + op = stack.pop() + else: RevPN.append(token) + while stack: + RevPN.append(stack.pop()) + return ' '.join(RevPN) + +def main(): + """Entry point""" + + parser = argparse.ArgumentParser(add_help=True, description="Pure-python command-line calculator.") + parser.add_argument("EXPRESSION", type=str, help="expression string to evaluate") + args = parser.parse_args() + try: + print(calc(RevPolNot(convertExpr(args.EXPRESSION)))) + except Exception as err: + print('ERROR:', err) diff --git a/final_task/setup.py b/final_task/setup.py index 1cdf8dc..4fa0077 100644 --- a/final_task/setup.py +++ b/final_task/setup.py @@ -1,126 +1,10 @@ -import operator -import math - -OPERATORS = {'+': operator.add, - '-': operator.sub, - '*': operator.mul, - '/': operator.truediv, - '^': operator.pow, - '%': operator.mod } - -'''def searchFunc(expr): - if symbol in FUNCTIONS: - start = expr.find(symbol) - if start != -1: - start = start+len(symbol)+1 - newExpr = expr[start:] - bracketsAmount=0 - for i in newExpr: - if i == '(': - bracketsAmount+=1 - elif i == ')' and bracketsAmount != 0: - bracketsAmount-=1 - elif i == ')': - break - count+=1 - newExpr = newExpr[:count] - searchFunc(newExpr) - else ''' - -def checkBrackets(expression): - bracketsAmount=0 - for symbol in expression: - if bracketsAmount==-1: - return False - if symbol == '(': - bracketsAmount+=1 - elif symbol == ')': - bracketsAmount-=1 - if bracketsAmount!=0: - return False - return True - -def allowedNums(): - return '0123456789.' - -def convertExpr(expr): - iter = 0 - i = 0 - out = '' - for symbol in expr: - if symbol == '-' and iter == 0: - out += symbol - elif symbol in allowedNums(): - out += symbol - iter+=1 - elif symbol in OPERATORS: - out += ' %s ' % (symbol) - iter+=1 - if symbol == ')' and len(expr) == i+1: - out += ' )' - iter=0 - elif symbol == ')' and expr[i+1] in allowedNums(): - out += ' ) * ' - iter+=1 - elif symbol == ')' : - out += ' )' - iter+=1 - if symbol == '(' and iter == 0: - out += '( ' - iter=0 - elif symbol == '(' and expr[i-1] in allowedNums(): - out += ' * ( ' - iter=0 - elif symbol == '(' and expr[i-1] == ')': - out += ' * ( ' - iter=0 - elif symbol == '(': - out += '( ' - iter=0 - i+=1 - return out.strip() - - -def pycalc(expr): - expr=RevPolNot(convertExpr(expr)) - stack = [0] - for token in expr.split(' '): - if token in OPERATORS: - op2, op1 = stack.pop(), stack.pop() - stack.append(OPERATORS[token](op1,op2)) - elif token: - stack.append(float(token)) - return stack.pop() - -def RevPolNot(expr): - operators = {'+': 1, - '-': 1, - '*': 2, - '/': 2, - '^': 3, - '%': 2} - RevPN = [] - stack = [''] - for token in expr.split(' '): - if token in operators: - op = stack.pop() - if op == '' or op == '(': - stack.append(op) - stack.append(token) - elif operators[token] <= operators[op]: - stack.append(token) - RevPN.append(op) - elif operators[token] > operators[op]: - stack.append(op) - stack.append(token) - elif token == '(': - stack.append(token) - elif token == ')': - op = stack.pop() - while not op == '(': - RevPN.append(op) - op = stack.pop() - else: RevPN.append(token) - while stack: - RevPN.append(stack.pop()) - return ' '.join(RevPN) +import setuptools + +setuptools.setup( + name='pycalc', + version='1.0' + author='Vlada Garavaya', + author_email='vl.garavaya@gmail.com', + packages=find_packages(), + entry_points={'console_scripts': ['pycalc=pycalc.pycalc:main']}, +) From 268c179d07af0ebf926fd34aef08215f97f8ec51 Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Mon, 12 Nov 2018 22:58:39 +0300 Subject: [PATCH 4/7] change pycodestyle --- final_task/pycalc/pycalc.py | 54 ++++++++++++------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/final_task/pycalc/pycalc.py b/final_task/pycalc/pycalc.py index 6edbea4..419407f 100644 --- a/final_task/pycalc/pycalc.py +++ b/final_task/pycalc/pycalc.py @@ -6,7 +6,7 @@ '*': operator.mul, '/': operator.truediv, '^': operator.pow, - '%': operator.mod } + '%': operator.mod} FUNCTIONS = ['abs', 'sin', @@ -14,36 +14,16 @@ 'log10', 'log'] - -def searchFunc(expr): - if symbol in FUNCTIONS: - start = expr.find(symbol) - if start != -1: - start = start+len(symbol)+1 - newExpr = expr[start:] - bracketsAmount=0 - for i in newExpr: - if i == '(': - bracketsAmount+=1 - elif i == ')' and bracketsAmount != 0: - bracketsAmount-=1 - elif i == ')': - break - count+=1 - newExpr = newExpr[:count] - searchFunc(newExpr) - else - def checkBrackets(expression): - bracketsAmount=0 - for symbol in expression: - if bracketsAmount==-1: + bracketsAmount = 0 + for symbol in expression: + if bracketsAmount == -1: return False if symbol == '(': - bracketsAmount+=1 + bracketsAmount += 1 elif symbol == ')': - bracketsAmount-=1 - if bracketsAmount!=0: + bracketsAmount -= 1 + if bracketsAmount != 0: return False return True @@ -59,32 +39,32 @@ def convertExpr(expr): out += symbol elif symbol in allowedNums(): out += symbol - iter+=1 + iter += 1 elif symbol in OPERATORS: out += ' %s ' % (symbol) - iter+=1 + iter += 1 if symbol == ')' and len(expr) == i+1: out += ' )' - iter=0 + iter = 0 elif symbol == ')' and expr[i+1] in allowedNums(): out += ' ) * ' - iter+=1 + iter += 1 elif symbol == ')' : out += ' )' - iter+=1 + iter += 1 if symbol == '(' and iter == 0: out += '( ' - iter=0 + iter = 0 elif symbol == '(' and expr[i-1] in allowedNums(): out += ' * ( ' - iter=0 + iter = 0 elif symbol == '(' and expr[i-1] == ')': out += ' * ( ' - iter=0 + iter = 0 elif symbol == '(': out += '( ' - iter=0 - i+=1 + iter = 0 + i += 1 return out.strip() From 210085c2eb887409cd067f24b7182a5ec446f9f9 Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Mon, 12 Nov 2018 23:06:08 +0300 Subject: [PATCH 5/7] change pycodestyle #2 --- final_task/pycalc/pycalc.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/final_task/pycalc/pycalc.py b/final_task/pycalc/pycalc.py index 419407f..e160a29 100644 --- a/final_task/pycalc/pycalc.py +++ b/final_task/pycalc/pycalc.py @@ -14,22 +14,25 @@ 'log10', 'log'] + def checkBrackets(expression): - bracketsAmount = 0 + bracketsAmount = 0 for symbol in expression: - if bracketsAmount == -1: - return False - if symbol == '(': + if bracketsAmount == -1: + return False + if symbol == '(': bracketsAmount += 1 - elif symbol == ')': + elif symbol == ')': bracketsAmount -= 1 - if bracketsAmount != 0: - return False + if bracketsAmount != 0: + return False return True -def allowedNums(): + +def allowedNums(): return '0123456789.' + def convertExpr(expr): iter = 0 i = 0 @@ -49,7 +52,7 @@ def convertExpr(expr): elif symbol == ')' and expr[i+1] in allowedNums(): out += ' ) * ' iter += 1 - elif symbol == ')' : + elif symbol == ')': out += ' )' iter += 1 if symbol == '(' and iter == 0: @@ -73,11 +76,12 @@ def calc(expr): for token in expr.split(' '): if token in OPERATORS: op2, op1 = stack.pop(), stack.pop() - stack.append(OPERATORS[token](op1,op2)) + stack.append(OPERATORS[token](op1, op2)) elif token: stack.append(float(token)) return stack.pop() + def RevPolNot(expr): operators = {'+': 1, '-': 1, @@ -106,11 +110,13 @@ def RevPolNot(expr): while not op == '(': RevPN.append(op) op = stack.pop() - else: RevPN.append(token) + else: + RevPN.append(token) while stack: RevPN.append(stack.pop()) return ' '.join(RevPN) - + + def main(): """Entry point""" From e5a29d6e375e258d9c1568653276df4b0209d03c Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Mon, 12 Nov 2018 23:12:36 +0300 Subject: [PATCH 6/7] change pycodestyle #3 --- final_task/pycalc/pycalc.py | 2 +- final_task/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/final_task/pycalc/pycalc.py b/final_task/pycalc/pycalc.py index e160a29..865a694 100644 --- a/final_task/pycalc/pycalc.py +++ b/final_task/pycalc/pycalc.py @@ -69,7 +69,7 @@ def convertExpr(expr): iter = 0 i += 1 return out.strip() - + def calc(expr): stack = [0] diff --git a/final_task/setup.py b/final_task/setup.py index 4fa0077..059c3bb 100644 --- a/final_task/setup.py +++ b/final_task/setup.py @@ -2,7 +2,7 @@ setuptools.setup( name='pycalc', - version='1.0' + version='1.0', author='Vlada Garavaya', author_email='vl.garavaya@gmail.com', packages=find_packages(), From f72155c3e89d6578046061dfedc3a912631847c4 Mon Sep 17 00:00:00 2001 From: VladaGaravaya <36517813+VladaGaravaya@users.noreply.github.com> Date: Tue, 13 Nov 2018 01:46:10 +0300 Subject: [PATCH 7/7] changes --- final_task/pycalc/pycalc.py | 1 + final_task/setup.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/final_task/pycalc/pycalc.py b/final_task/pycalc/pycalc.py index 865a694..e110c64 100644 --- a/final_task/pycalc/pycalc.py +++ b/final_task/pycalc/pycalc.py @@ -1,5 +1,6 @@ import operator import math +import argparse OPERATORS = {'+': operator.add, '-': operator.sub, diff --git a/final_task/setup.py b/final_task/setup.py index 059c3bb..030e781 100644 --- a/final_task/setup.py +++ b/final_task/setup.py @@ -5,6 +5,6 @@ version='1.0', author='Vlada Garavaya', author_email='vl.garavaya@gmail.com', - packages=find_packages(), + packages=setuptools.find_packages(), entry_points={'console_scripts': ['pycalc=pycalc.pycalc:main']}, )