### CS30 - Spring 2015 - Class 4

#### Example code in this lecture

conditionals.py
conditional-turtle.py
prime.py

#### Lecture notes

- assignment 1 due tonight
- assignment 2 out soon
- will post practice problems and solutions soon

• run add_circles function from conditional-turtle.py using setcolor_xy
- picks random x and y coordinates to draw a circle
- uses randint
- How are the colors chosen?
- each quadrant of the xy-axes is a different color
- how can we do this?

• booleans
- We've seen three types so far: int, float and str (string)
- Python has another type called bool (short for boolean)
- bool can only take the value True or False
- bool's generally result from asking T/F question
- What questions might we want to ask on data we've seen so far (e.g. numbers)?
- comparison operators
- == (equal)
- notice that '=' is the assignment operator while '==' asks whether two things are equal
- != (not equal)
- < (less than)
- > (greater than)
- <= (less than or equal to)
- >= (greater than or equal to)
- Using the comparison operators
>>> 10 < 0
False
>>> 11 >= 11
True
>>> 11 > 11.0
False
>>> 11 >= 10.9
True
>>> 10 == 10.1
False
>>> "test" == "test"
True
>>> "test" == "TEST"
False
>>> 10 != 10
False
>>> 10 != 11
True
>>> "banana" < "apple"
False
>>> type(True)
<type 'bool'>
>>> type(0 < 10)
<type 'bool'>

• combining booleans
- we can also combine boolean expressions to make more complicated expressions
- what kind of connectors might we want?
- and
<bool expression> and <bool expression>

- only returns True if both expressions are True
- otherwise, it returns false

>>> x = 5
>>> x < 10 and x > 0
True
>>> x = -1
>>> x < 10 and x > 0
False

- Truth table
- a truth table gives you a mapping from input to output for boolean functions

A B | A and B
-------------
T T | T
T F | F
F T | F
F F | F

- or
<bool expression> or <bool expression>

- returns True if either expression is True
- False only if they are both False

>>> x = 5
>>> x < 10 or x > 0
True
>>> x = -1
>>> x < 10 or x > 0
True

- Truth table

A B | A or B
-------------
T T | T
T F | T
F T | T
F F | F
- not
not <bool expression>

- negates the expression
- if it's True returns False
- if it's False returns True

>>> not 5 == 5
False

- Truth table

A | not B
-------------
T | F
F | T

• if statement
- the key use of bool's is to make decisions based on the answers
- the "if" statement allows us to control the flow of the program based on the result of a boolean expression

if bool_expression:
# do these statements if the bool is True
statement1
statement2

statement3

- the if statement is called a "control" statement in that it changes how the program flows
- as the program runs, it evaluates the boolean expression
- if it is true, it evaluates all of the statements under the "if" block and then continue on
- it will execute statement1, statement2 and then statement3
- otherwise (i.e. the boolean was false), it will skip these statements and continue on
- it will just execute statement3

- look at simple_if function in conditionals.py code

• run stupid_name function from conditionals.py code
- raw_input
- takes a string as a parameter
- it displays the string to the user
- then waits for the user to enter some text. The program doesn't continue until the user hits enter/return
- whatever the user typed will be returned by the raw_input function as a string
- if you want a number you need to use int(...) or float(...)

- first prompts the user for their name
- depending on the input, the output of the program partially differs
- if statements allow us to control the flow of the program
- if-else: sometimes we'd also like to do something if the bool is False, in this case, we can include an "else"

if <bool expression>:
# do these statements if the bool is True
statement1
statement2
else:
# do these statements if the bool is False
statement3
statement4

statement5

- if the boolean expression is true
- execute statement1, statement2 then statement 5
- if the boolean expression is false
- execute statement3, statement4 then statement 5

• look at stupid_name function from conditionals.py code
- we first use the raw_input function to get the user's name
- raw_input returns the text the user entered
- in the variable "name" will be whatever the users entered
- name == "Dave" checks whether the entered name is "Dave"
- if statement directs the program's behavior depending on the answer
- finally, regardless of the name, we print out "Nice to meet you..."

• run forecast function in conditionals.py code
- takes two parameters
- temperature
- amount of rain
- depending on what these values are, gives us different answers
- to start with, let's just look at the temperature. We want to define 4 temperature bands:
- > 80 => "hot"
- 71 - 80 => "warm"
- 51 - 70 => "cool"
- <= 50 => "cold"

- say we have a variable called temperature with the temperature, how would we write the if statements for this?
if temperature > 80:
temp = "hot"
if 70 < temperature <= 80:
temp = "warm"
if 51 < temperature <= 70:
temp = "cool"
if temperature <= 50:
temp = "cold"
- if we know the temperature is above 80, do we need to check any of the other ones?
- no!
- Python has another statement that allows us to represent this type of expression: elif

if <bool expression>:
statement1
elif <bool expression>:
statement2
... # we can have as many elif blocks as we want
else:
statement3

statement4

- the program starts with the first if statement. If it is true, it executes the statements in the if block then goes to the end (after else) and continues
- if it is false, it goes to the first elif and see if it is true. If it is true, it executes the statements in the elif block then goes to the end (after the else) and continues
- the program will keep going down the list of elif statements as long as none of them are true
- if they are all false, then it will execute the statements under else
- why is the elif useful?
- avoids redundant calculations: if we know things are mutually exclusive, then once we find one that is true, don't need to check the others
- can simplify the statements, when we get to an elif statement, we know that the above boolean checks are false and don't need to check those again

• look at the temperature_report and precipitation_report functions in conditionals.py code
- both use if-elif-else statements to calculate an answer

• look at forecast function in conditionals.py code
- uses the other functions to generate the answer

• \
- Python assumes one statement per line
- We've seen multi-line strings. Python also allows you to put a statement over multiple lines
- if you put a \ (backslash) at the end of a line, Python will continue reading on the next line

• look at add_circles function in conditional-turtle.py code
- setcolor_xy function takes the x and y as a parameter and sets the fill color
- what will this function look like?

• look at setcolor_xy function in conditional-turtle.py code
- uses the if-elif-else statement to select between the four options

• run add_circles function in conditional-turtle.py code with setcolor_random function instead of setcolor_xy
- what does this do?
- randomly picks between blue, purple, red and yellow (instead of based on x, y)
- how could we get this behavior?
- use random.randint to select a number between 1 and 4
- save this number and use it in an if-elif-else statement
- you MUST save this number to a variable and not try and do your if/else statement based on new calls to random.randint
- look at setcolor_random function

• prime numbers
- what is a prime number?
- a number that is only divisible by 1 and itself
- what are the first 10 prime numbers?
- the first 100?
- the first 1000?
- How could we write a program that figured this out?
- To start with, how can we tell if a number is prime?
- try and divide it by all of the numbers between 1 and the number
- if none of them divide evenly, then it's prime, otherwise it's not
- A few questions:
- do we need to check all of the numbers up to that number?
- just need to check up to sqrt(number)
- how can we check to see if a number divides evenly?
- use the remainder/modulo operator and see if it equals 0 (i.e. no remainder)
- how can we check all of the numbers?
- use a for loop

• look at isprime function in prime.py code
- for loop starting at 2 up to the sqrt of the number
- there are multiple versions of the range function
- range with a simple parameter starts counting at 0 up to but not including the specified number
- range with 2 parameters starts counting at the first number up to, but not including, the second number

for i in range(10, 20):
print i

would print out the numbers from 10 - 19 (but not 20)

- the if statement checks to see if the number is divisible by i
- if we find this we can stop early!
- the minute we find this, we know it's not prime so we can return False
- what does "return True" do?
- if we've checked all of the numbers and none of them were divisible (otherwise we would have exited the function with the return False), so return True
- we can use this to see if a number is prime

>>> isprime(5)
True
>>> isprime(6)
False
>>> isprime(100)
False
>>> isprime(101)
True