אופרטורים ברמה הראשונה
שיעור 13 מתוך 29 בקורס פרויקט מחשבון באמצעות Python של Coddy.
כפי שדיברנו קודם, יש סדר פעולות במתמטיקה.
האופרטורים '*', '/' ו־'%' מחושבים לפני '+' ו־'-'.
בקורס הזה אנחנו קוראים לאופרטורים '*', '/' ו־'%' — אופרטורים ברמה הראשונה.
ולאופרטורים '+' ו־'-' — אופרטורים ברמה השנייה.
אתגר
קלכרגע struct תומכת רק באופרטורים מדרגה שתיים.
המשימה שלך היא להוסיף תמיכה באופרטורים מדרגה אחת עבור struct.
ודא שסדר החישובים נשמר!
דוגמאות:
struct([3, '*', 2])->['*', 3, 2]struct([1, '+', 2, 'mul', 3])->['+', 1, ['mul', 2, 3]]struct([2, 'mod', 3, '-', 4, '/', 5.2])->['-', ['mod', 2, 3], ['/', 4, 5.2]]
נסו בעצמכם
def calc(op, n1, n2=None):
if not isinstance(n1, int) and not isinstance(n1, float):
raise Exception('Invalid number "' + str(n1) + '"')
if n2 is None:
if op == '+' or op == 'add':
return n1
if op == '-' or op == 'sub':
return -n1
raise Exception('Invalid operator "' + op + '"')
if not isinstance(n2, int) and not isinstance(n2, float):
raise Exception('Invalid number "' + str(n2) + '"')
if op == '+' or op == 'add':
return n1 + n2
if op == '-' or op == 'sub':
return n1 - n2
if op == '*' or op == 'mul':
return n1 * n2
if op == '/' or op == 'div':
if n2 == 0:
raise Exception("Division by zero")
return n1 / n2
if op == '%' or op == 'mod':
if n2 == 0:
raise Exception("Division by zero")
return n1 % n2
if op == '^' or op == 'pow':
return n1 ** n2
raise Exception('Invalid operator "' + op + '"')
def eval(lst):
if not isinstance(lst, list):
raise Exception('Failed to evaluate "' + str(lst) + '"')
if len(lst) == 2:
op = lst[0]
n = lst[1]
if not isinstance(n, list):
return calc(op, n)
if isinstance(n, list):
n = eval(n)
return calc(op, n)
elif len(lst) == 3:
op = lst[0]
n1 = lst[1]
n2 = lst[2]
if not isinstance(n1, list) and not isinstance(n2, list):
return calc(op, n1, n2)
if isinstance(n1, list):
n1 = eval(n1)
if isinstance(n2, list):
n2 = eval(n2)
return calc(op, n1, n2)
else:
raise Exception('Failed to evaluate "' + str(lst) + '"')
OPERATORS = ['+', '-', 'add', 'sub']
def struct(lst):
i = 0
while i < len(lst):
if lst[i] in OPERATORS:
if len(lst) == 3:
return [lst[i], lst[i - 1], lst[i + 1]]
temp = lst[:i - 1]
temp.append([lst[i], lst[i - 1], lst[i + 1]])
temp += lst[i + 2:]
lst = temp
else:
i += 1
return lstכל השיעורים ביחידה פרויקט מחשבון באמצעות Python
4מבנה
אופרטורים בסיסייםתרגלו בעצמכם: קומפיילר Python אונליין