# branching: and, or, not; nesting

Try the Jupyter notebook version.

## motivation

Frequently we want to make more complex branching decisions, involving two or more conditions. For example: if you start the labs early and you study for the quizzes you will do well in this class. Notice how those two conditions (start labs early, study for quizzes) are combined with the `and` operator. If both conditions are True, then the combined condition is also True.

Combining conditions with `and` and `or`, or nesting the `if` statements are two ways to create more complex branching decisions.

## syntax

For the `and` and `or` logical operators, you can simply combine two conditions like this:

``````if some-condition-is-True and some-other-condition-is-True:
do this block of code
else:
do this block of code

if some-condition-is-True or some-other-condition-is-True:
do this block of code
else:
do this block of code``````

You could also use nested if statements to get the same effect for the two conditions joined with the `and` operator:

``````if some-condition-is-True:
if some-other-condition-is-True:
do this block of code
# this inner block only executed if both conditions True!
else:
do this block of code
else:
do this block of code``````

As before, a block of code can be one or more lines, and must all be indented.

## and, or, not

Again, using `and` between two conditions requires both to be `True` for the combined condition to be `True`. Using `or` requires either (or both) to be `True`. The `not` operator just negates the condition.

Here's a table showing two conditions, A and B, their possible values (both True, one True the other False, etc), and the values of the combined conditions:

``````A     B      A and B      A or B    not A
----  ----   -------      ------    -----
True  True   True         True      False
True  False  False        True      False
False True   False        True      True
False False  False        False     True``````

## examples

Here's a simple test to see if input from the user is in range:

``````userchoice = int(input("Please enter a number from 1-10: "))

if userchoice >= 1 and userchoice <= 10:
print("Thank you!")
else:
print("That's not in range!!! :( ")``````

You could also check if the input is not out of range:

``````if not (userchoice < 1 or userchoice > 10):
print("Thank you!")
else:
print("That's not in range!!! :( ")``````

That seems klunky, but it does work. Notice the `and` changed to an `or`, the comparison operators changed (greater-than-or-equal to less-than, etc), and we added the `not` or negative to the whole thing.

You could also do the above using nested statements:

``````if userchoice >= 1:
if userchoice <= 10:
print("Thank you!")
else:
print("That's too high!!! :( ")
else:
print("That's too low!!! :( ")``````

That's more lines of code, but it also gives the user a more precise error message.

## challenge

Write a speeding ticket calculator, with these three cases:

• going less than or equal to speed limit: no ticket or warning
• over the limit, but less than or equal to 5 mph over: just a warning
• going more than 5 mph over the speed limit: ticket (see fine below)

If you are caught speeding where the posted speed limit is >= 65 mph, your fine is \$33 plus \$2 for every mph over the speed limit.

If you are caught speeding where the posted speed limit is less than 65 mpg, your fine is \$25 plus \$2 for every mph over the speed limit.

``````\$ python3 ticket.py
What is the speed limit in mph? 70
How fast were you going in mph? 68
Safe driving!

\$ python3 ticket.py
What is the speed limit in mph? 70
How fast were you going in mph? 72
A little fast, but no ticket.

\$ python3 ticket.py
What is the speed limit in mph? 70
How fast were you going in mph? 80
You were speeding and your fine is \$53``````

CS21 Topics