# Review from yesterday¶

In [ ]:
# Fill in based on questions


# For loops¶

In [ ]:
# This is the generic syntax for loops
# The loop body is not optional
for VARIABLE in {LIST, STRING, range}:
FOR_LOOP_BODY

In [36]:
# Looping over a LIST will go through the elements of a list in order
# and perform the loop body.
# The list can be a constant
for x in [0, 1, 2]:
print(x)

0
1
2

In [37]:
# or a variable
y = [0, 1, 2]
for x in y:
print(x)

0
1
2

In [38]:
# Lists can contain any type
fruits = ["apple", "banana", "cherry"]
for x in fruits:
print(x)

apple
banana
cherry

In [39]:
# You can put control flow in a loop
fruits = ["apple", "banana", "cherry"]
for x in fruits:
if x == 'apple':
print(x)

apple

In [40]:
fruits = ["apple", "banana", "cherry"]
for x in fruits:
if x != 'apple':
print(x)

banana
cherry

In [6]:
# The rules for looping over strings are the same as lists,
# except with the string being taken one character at a time
for x in 'apple':
print(x)

a
p
p
l
e

In [42]:
# range is special. Range can take 1, 2, or 3 arguments
# In this course, you will only use range in for loops
# When range takes 1 argument (call it n), it is like looping over the list from 0 to n-1
for x in range(5):
print(x)

0
1
2
3
4

In [2]:
# What will this do?
for x in range(0):
print(x)

In [44]:
# range with two arguments (call them n and m) is like looping over the list from n to m-1
for x in range(3, 6):
print(x)

3
4
5

In [3]:
# What will this do?
for x in range(3, 3):
print(x)

In [45]:
# Range with three arguments (call them n, m, and step)
# is like looping over the list from n to m-1, but incrementing by step
for x in range(3, 8, 2):
print(x)

3
5
7


# Advanced for loops¶

In [4]:
# You can put loops inside loops
# ALWAYS make sure the variables for the loops are different
for i in range(3):
for j in range(3): # DO NOT USE i HERE
print(i, j)

0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2

In [5]:
# This is super tricky. Walk through the loop one step at a time
for i in range(3):
for j in range(i):
print(i, j)

1 0
2 0
2 1


# More on functions¶

In [47]:
# Remebmer that you can have control flow in functions
def passingGrade(score):
if score > 50.0:
return True
else:
return False

print(passingGrade(60.0))
print(passingGrade(25.0))

True
False

In [49]:
# You can also have loops in functions
def loopInFunction(x):
for i in range(x):
print(i)

loopInFunction(4)

0
1
2
3

In [50]:
# What's the difference between this function and the one above?
def loopInFunction2(x):
for i in x:
print(i)

loopInFunction2([0, 1, 10, -2, 5])

0
1
10
-2
5

In [51]:
# Remember how loops over strings work
def loopInFunction2(x):
for i in x:
print(i)

loopInFunction2('5637291')

5
6
3
7
2
9
1

In [52]:
# Functions can call functions
def func1(x):
if len(x) > 5:
return True
else:
return False

def func2(x):
return func1(x)

print(func2([0, 1, 2]))
print(func2([0, 1, 2, 3, 4, 5, 6, 7]))

False
True

In [54]:
# More complicated example of functions calling functions
def func1(x):
if len(x) > 5:
return True
else:
return False

def func2(x):
if func1(x):
print('len(x) > 5')
else:
print('len(x) <= 5')

func2([0, 1, 2])
func2([0, 1, 2, 3, 4, 5, 6, 7])
print(func2([0]))

len(x) <= 5
len(x) > 5
len(x) <= 5
None