"""Evaluating expressions.
This file is not meant to be run as a script - cut and paste
lines into the interpreter.
"""


# an expression is something that the interpreter can evaluate

# We build expressions from simpler expressions.
# The basic building blocks are literals and identifiers:

17

"hello"

# if we define a variable, e.g.,
minutes = 59
# then the variable by itself is also an expression

minutes

# think of an expression as something that you can assign
# or print

# We can construct compound expressions by joining simpler
# expressions using operators:

17 + 42

"hello" + "hello"

# notice that the action of the operator depends on the operands:
# integer addition is not the same as string addition (concatenation).

# We can use the python interpreter to evaluate arithmetic expressions
# But the results are not necessarily what we would expect.  For example

1 / 2

# The reason is that python performed integer division.
# You get a different result if you do

1.0 / 2

# there is a truncating division operator that performs integer
# division:

1 // 2
1.0 // 2

# Recommendation: whenever you want integer division use //
# otherwise, make sure one of the operands is a floating point number

x = 1
y = 2
float(x) / y

# note that in Python 3.x the behavior of the division operator is different
# Let's try it out:

from __future__ import division
1 / 2

# you can print an expression:
hours = 11
minutes = 59
print "Number of minutes since midnight ", hours * 60 + minutes

# you can assign the result of an expression to a variable:
minutesSinceMidnight = hours * 60 + minutes

# operators have rules of precedence:

(1 + 2) * 3

# is not the same as

1 + 2 * 3

# when in doubt, use parentheses!

# the exponentiation operator:
2**8