Lecture 7: Functions & Parameters, Booleans, and Strings

June 30th, 2021


Today - interpreter, math int/float, style, black box examples, boolean logic, string introduction, string +=, string for/i/range loop

The Python Interpreter

Examples below use the Python interpreter >>> to type expressions into Python, see what they do. You can access the interpreter using the Hack Mode button on the experimental server, or within PyCharm, the "Python Console" tab at the lower left.

In the interpreter, you type code at the >>> prompt, Python evaluates it, printing any result on the next line.

>>> 1 + 1
2
>>>

You will learn many parts of Python by seeing those feature explained in class. For some cases, you can also learn what Python does by typing an example into the interpreter to see what it does. This is a nice technique in lecture to show what various Python features do.

For more details, see the guide Python Interpreter

Two Math Systems - int and float

You would think computer code has a lot to do with numbers, and here we are.

See in Python reference: Python Math

Surprisingly, computer code generally uses two different types of numbers - "int" and "float".

int numbers

>>> 1 + 2
3
>>>

Use of ints - Indexing

float numbers

>>> 1.5 + 1.5
3.0
>>> 
>>> 1.0 + 2.0
3.0
>>> 

Math Operators: + - * / **

>>> 2 + 3
5
>>> 2 + 3 * 4   # Precedence
14
>>> 2 * (1 + 2) # Use parenthesis
6
>>> 10 ** 2     # 10 Squared
100
>>> 2 ** 100    # Grains of sand in universe
1267650600228229401496703205376
>>>
>>>
>>> 1 + 2 + 3
6
>>> 1 + 2.0 + 3  # Makes result float
6.0

Division / → float

>>> 7 / 2
3.5
>>> 8 / 2
4.0

Int Division // → int

>>> 7 // 2
3
>>> 8 // 2
4
>>> 102 // 4
25

Big Picture Strategy - Divide and Conquer

Data Flow Picture

Here is a way of looking at a program.

You have some files with data in them. You write code to load the data into Python in one form. Then compute a transform into another form. Then a further computation produces an "answer" form. You publish the answer and get tweets of praise - the coding lifecycle! You can think of this as a sort of "data flow", from the original data to the final output. alt: data flows through program

Today: Black Box Function

"Black Box" Function Model

function is black box with parameters in and result out

Black-box model of a function: function runs with parameters as input, returns a value. All the complexity of its code is sealed inside.

The black box model makes it easy to call the function - provide data you have as the input, call the function, get back an answer.

Strategy - One Function at a Time

For Divide and Conquer, want to be able to work on each function separately, one at a time. We need to keep the functions sealed off from each other as much as possible. The black box model works well for this, narrowing the interactions to just the input and output data for each function.


Write Black Box Code - Cases

Here we'll work through the code for first black-box examples. There are in the logic 1 section on the experimental server.

Think of each input as a "case" the function must handle, return the correct output. To be correct, code needs to handle all the possible input cases. One hallmark of putting something on the computer is that it forces you to think through all the cases.

1. winnings1() Example

> winnings1()

score winnings
0      0
1      10
2      20
3      30
4      40
5      60  # 12x kicks in here
6      72
7      84
8      96
9      108
10     120

1. Function Input = Parameter

def winnings1(score):
    ...

2. Function Output = return score * 10

def winnings1(score):
    return score * 10

Experiment 1 - winnings1()

You can type these in and hit the Run button as we go. The results are pretty easy to follow.

def winnings1(score):
    return score * 10

Experimental Server Output Format

alt: experimental server output table

if-return Pick-Off Strategy

Experiment 2

def winnings1(score):
    if score >= 5:
        return score * 12

Add if-logic to pick off the >= 5 case. It's only right half the time.

None Result

Experiment 3 - Very Close

def winnings1(score):
    if score >= 5:
        return score * 12

    if score < 5:
        return score * 10

Add pick-off code for the score < 5 case. This code returns the right result in all cases. There is just at tiny logical flaw.

Experiment 4 - Perfect

def winnings1(score):
    if score >= 5:
        return score * 12

    # If we get to this line, score < 5
    return score * 10

winnings1() Observations

def winnings1(score):
    if score >= 5:
        return score * 12
        return score * 10

That does not work. The second return is in the control of the if. It never runs because the line above exits the function. In Python code, where a line is indented is very significant.


2. Winnings2 Example

Extra practice example.

> winnings2()

Say there are 3 cases. Use a series of if-return to pick them off. Need to think about the order. Need to put the == 10 case early.

Winnings2: The int score number in the range 0..10 inclusive. Bonus! if score is 10 exactly, winnings is score * 15. If score is between 4 and 9 inclusive, winnings is score * 12. if score is 3 or less, winnings is score * 10. Given int score, compute and return the winnings.

Solution

def winnings2(score):
    if score == 10:
        return score * 15
  
    if score >= 4:  # score <= 9 is implicit
        return score * 12
    
    # All score >= 4 cases have been picked off.
    # so score < 4 here.
    return score * 10

Boolean Values

For more detail, see guide Python Boolean

Ways to Get a Boolean

Try this in the interpreter (or Hack Mode button at bottom experimental server)

>>> n = 5   # assign to n to start
>>> n == 6
False
>>> n == 5
True
>>> n != 6
True
>>> 
>>> n < 10
True
>>> n < 5  # < is strict
False
>>> 
>>> n <= 5  # less-or-equal
True
>>> 
>>> n > 0
True

Boolean Operators: and or not

Weather Examples - and or not

Say we have temp variable is a temperature, and is_raining is a Boolean indicating if it's raining or not. Here are some examples to demonstrate and or not:

# OR: either or both are true
# Say we don't want to go outside if
# if it's cold or raining.
if temp < 50 or is_raining:
    print('not going outside!')


# AND
# We want to go outside if it's snowing.
if temp < 32 and is_raining:
    print('yay snow!')


# AND + NOT
# Sunny and nice case:
if temp > 70 and not is_raining:
    print('Sunny and nice!')


# Style note: don't use == False or == True
# to form a test. See above how "is_raining"
# is used directly in the test, or with a "not"
# in front of it.

Numeric and Example

Suppose we have this code, and n holds an int value.

if n > 0 and n < 10:
   # get here if test is True

What must n be inside the if-statement? Try values like 0 1 2 3 . 8 9 10

You can work out that n must be a an int value in the range 1..9 inclusive.

3. is_teen(n) Example

> is_teen()

is_teen(n): Given an int n which is 0 or more. Return True if n is a "teenager", in the range 13..19 inclusive. Otherwise return False. Write a boolean test to pick off the teenager case.

Solution

def is_teen(n):
    # Use and to check
    if n >= 13 and n <= 19:
        return True

    return False

    # Future topic: possible to write this
    # as one-liner: return n >= 13 and n <= 19

4. Lottery Scratcher Example

> scratcher()

An extra example for practice.

Lottery scratcher game: We have three icons called a, b, and c. Each is an int in the range 0..10 inclusive. If all three are the same, winnings is 100. Otherwise if 2 are the same, winnings is 50. Otherwise winnings is 0. Given a, b and c inputs, compute and return the winnings. Use and/or/== to make the tests.

Solution:

def scratcher(a, b, c):
    # 1. All 3 the same
    if a == b and b == c:
        return 100
    
    # 2. Pair the same (3 same picked off above)
    if a == b or b == c or a == c:
        return 50
    
    # 3. Run gets to here, nothing matched
    return 0

Strings

For more detail, see guide Python Strings

len() function

>>> len('Hello')
5
>>> s = 'Hello'   # Equivalently
>>> len(s)
5
>>> len('x')
1
>>> len('')
0

Empty String ''

Zero Based Indexing - Super Common

alt: the string 'Python' with 6 index numbers 0..5

String Square Bracket Index

>>> s = 'Python'
>>> s[0]
'P'
>>> s[1]
'y'
>>> s[4]
'o'
>>> s[5]
'n'
>>> s[6]
IndexError: string index out of range

String Immutable

>>> s = 'Python'
>>> s[0]        # read ok
'P'
>>> s[0] = 'X'  # write not ok
TypeError: 'str' object does not support item assignment

String +

>>> a = 'Hello'
>>> b = 'there'
>>> a + b
'Hellothere'
>>> a
'Hello'

1. Set Var With =

We've already used = to set a variable to point to a value, in this case pointing to the string 'hello'.

s = 'hello'

alt: set s to point to 'hello'

2. Change Var With =

What if we use = to set an existing variable to point to a new value? This just changes the variable to point to the latest value, forgetting the previous value. The assignment = could be translated to English as "now points to".

s = 'hello'
# change s to point to 'bye'
s = 'bye'

alt: change s to point to new string

Useful Pattern: s = s + something

>>> s = 'hello'
>>> s = s + '!'
>>> s = s + '!'
>>> s
'hello!!'

alt: change s to point to new string


for/i/range String Loop

# have string s
for i in range(len(s)):
    # access s[i] in here

1. double_char() Example

> double_char

Solution code

def double_char(s):
    result = ''
    for i in range(len(s)):
        result = result + s[i] + s[i]
    return result

Exercise/Example - not_ab()

If we have time.

not_ab(s): Given string s. Return a new string made of all the chars in s which are not lowercase 'a' or 'b'. Use a for/i/range loop.

Try to solve using for/i/range loop with the += pattern like double_char(). Test each char to see if it is 'a' or 'b' using !=.

> not_ab