───✱*.。:。✱*.:。✧*.。✰*.:。✧*.。:。*.。✱ ───
Lesson: Variables, Data Types, and Coding Standards
Description: GitHub
def evaluate_rpn(expression: str) -> float:
"""
Evaluates a reverse polish notation expression.
:param expression: A string containing a reverse polish notation expression.
:return: The result of the expression as a float.
"""
stack = []
tokens = expression.split()
operations = {
"+": lambda a, b: a + b,
"-": lambda a, b: a - b,
"*": lambda a, b: a * b,
"/": lambda a, b: a / b,
"**": lambda a, b: a ** b,
"//": lambda a, b: a // b,
"%": lambda a, b: a % b,
}
for token in tokens:
if token.isdigit() or (token.replace(".", "", 1).isdigit() and token.count(".") < 2):
stack.append(float(token))
else:
try:
b = stack.pop()
a = stack.pop()
stack.append(operations[token](a, b))
except (IndexError, KeyError):
raise ValueError("Invalid expression")
except:
raise ValueError("Invalid operation")
if len(stack) != 1:
raise ValueError("Invalid expression")
return stack[0]
def colorize(text: str, color_code: str) -> str:
"""
Wraps the text with ANSI escape codes to apply color.
:param text: The text to colorize.
:param color_code: The ANSI color code.
:return: The colorized text.
"""
return f"\033[{color_code}m{text}\033[0m"
def string_slicing(str: str, start: int, end: int) -> None:
"""
Prints the result of slicing the string with the given start and end indices.
:param str: The string to slice.
:param start: The start index of the slice.
:param end: The end index of the slice.
"""
print(f"{str}[{start}:{end}] -> {str[start:end]}")
# This is outside of main() so it's not indented weirdly
START_MESSAGE = f"""
Reverse Polish Notation (RPN) is a mathematical notation in which every operator follows all of its operands.
It does not need any parentheses; it"s also known as postfix notation.
The supported operations are: +, -, *, /, **, //, %.
IE: 2 3 + 5 * => (2 + 3) * 5 = 25
"""
def main() -> None:
string_slicing("Reverse Polish Notation", 8, 14)
print(START_MESSAGE)
while True:
# PEP 8 wants this to be <80 chars so it is split into two lines
expression = input(
'Enter a reverse polish notation expression (or type "exit" to quit): '
)
if expression.lower() == "exit":
print(colorize("Exiting the program.", "31"))
break
try:
result = evaluate_rpn(expression)
print(
colorize(f"The result of the expression is: {result}\n", "32"))
except ValueError as e:
print(colorize(f"Error: {e}\n", "31"))
if __name__ == "__main__":
main()
───✱*.。:。✱*.:。✧*.。✰*.:。✧*.。:。*.。✱ ───