In [ ]:
from sympy import *
x, y, z = symbols('x y z')


For each exercise, fill in the function according to its docstring.

## Creating expressions from classes¶

Create the following objects without using any mathematical operators like +, -, *, /, or ** by explicitly using the classes Add, Mul, and Pow. You may use x instead of Symbol('x') and 4 instead of Integer(4).

$$x^2 + 4xyz$$$$x^{(x^y)}$$$$x - \frac{y}{z}$$
In [ ]:
def explicit_classes1():
"""
Returns the expression x**2 + 4*x*y*z, built using SymPy classes explicitly.

>>> explicit_classes1()
x**2 + 4*x*y*z
"""

In [ ]:
def explicit_classes2():
"""
Returns the expression x**(x**y), built using SymPy classes explicitly.

>>> explicit_classes2()
x**(x**y)
"""

In [ ]:
def explicit_classes3():
"""
Returns the expression x - y/z, built using SymPy classes explicitly.

>>> explicit_classes3()
x - y/z
"""


## Nested args¶

In [ ]:
expr = x**2 - y*(2**(x + 3) + z)


Use nested .args calls to get the 3 in expr.

In [ ]:
def nested_args():
"""
Get the 3 in the above expression.

>>> nested_args()
3
"""


## Traversal¶

Write a post-order traversal function that prints each node.

In [ ]:
def post(expr):
"""
Post-order traversal

>>> expr = x**2 - y*(2**(x + 3) + z)
>>> post(expr)
-1
y
2
3
x
x + 3
2**(x + 3)
z
2**(x + 3) + z
-y*(2**(x + 3) + z)
x
2
x**2
x**2 - y*(2**(x + 3) + z)
"""

In [ ]:
for i in postorder_traversal(expr):
print(i)