Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24,...

42
Loops! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range?

Transcript of Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24,...

Page 1: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Loops!

We've seen variables change in-place before:

[ x*6 for x in range(8) ]

[ 0, 6, 12, 18, 24, 30, 36, 42 ]

remember range?

Page 2: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

fore!

for x in range(8):

print('x is', x)

print 'Phew!'

x is assigned each value from this

sequence

the BODY or BLOCK of the for loop runs with that x

Code AFTER the loop will not run until the loop is finished.

1

2

3

4

LOOP back to step 1 for EACH value in the list

Page 3: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

four on for

for x in range(8):

print('x is', x)

factorial function?

sum the list?

construct the list?

Page 4: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Fact with for

def fact( n ):

answer = 1

for x in range(n):

answer = answer * x

return answer

Page 5: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Fact with for

def fact( n ):

answer = 1

for x in range(1,n+1):

answer = answer * x

return answer

Page 6: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Accumulating an answer…

def sum( L ):

""" returns the sum of L's elements """

sum = 0

for x in L:

sum = sum + x

return sum

Finding the sum of a list:

Accumulator!

shortcuts?

vs. recursion?

sum every OTHER element?

Page 7: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Shortcut

Shortcuts for changing variables:

age = 38

age = age + 1

age += 1 #shortcut for age = age + 1

Page 8: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Two kinds of for loops

Element-based Loops

sum = 0

for x in L: sum += x

L = [ 42, -10, 4 ]

x

"selfless"

Page 9: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Two kinds of for loops

Element-based Loops

L = [ 42, -10, 4 ]

x

L = [ 42, -10, 4 ]

i0 1 2

Index-based Loops

sum = 0

for x in L: sum += x

sum = 0

for i in : sum +=

Page 10: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Two kinds of for loops

Element-based Loops

L = [ 42, -10, 4 ]

x

L = [ 42, -10, 4 ]

i0 1 2

Index-based Loops

sum = 0

for x in L: sum += x

sum = 0

for i in range(len(L)): sum += L[i]

L[i]

Page 11: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Sum every other element

def sum( L ):

""" returns the sum of L's elements """

sum = 0

for i in range(len(L)):

if ________:

sum += L[i]

return sum

Finding the sum of a list:

Accumulator!

shortcuts?

vs. recursion?

sum every OTHER element?

Page 12: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Sum every other element

def sum( L ):

""" returns the sum of L's elements """

sum = 0

for i in range(len(L)):

if i % 2 == 0:

sum += L[i]

return sum

Finding the sum of a list:

Accumulator!

shortcuts?

vs. recursion?

sum every OTHER element?

Page 13: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Extreme Looping

What does this code do?

print 'It keeps on'

while True: print('going and’)

print('Phew! I\'m done!’)

Page 14: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Extreme Looping

Anatomy of a while loop:

print 'It keeps on'

while True: print('going and’)

print('Phew! I\'m done!’)

“while” loop

the loop keeps on running as long as this test is True

alternative tests?

This won't print until the while loop finishes - in this case, never!

Page 15: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Extreme Looping

import time

print 'It keeps on'

while True: print('going and’) time.sleep(1)

print('Phew! I\'m done!’)

“while” loop

Slowing things down…

the loop keeps on running as long as this test is True

Page 16: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Making our escape!

import randomescape = 0

while escape != 42: print('Help! Let me out!’) escape = random.choice([41,42,43])

print('At last!’)

how could we count the number of loops we run?

Page 17: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Loops aren't just for lists…

for c in 'down with CS!':

print ( c )

Page 18: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print(n)

def min( L ):

Write a loop to find and return the min of a list, LL is a list of numbers.

n = 3while n > 1: print n if n % 2 == 0: n = n/2 else: n = 3*n + 1

def isPrime( n ):

Write a loop so that this function returns True if its input is prime and False otherwise:

n is a positive integer

Page 19: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print(n)

??

n = 3while n > 1: print(n) if n%2 == 0: n = n/2 else: n = 3*n + 1

Page 20: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

??

Page 21: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

3

Page 22: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

310

Page 23: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

3105

Page 24: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

310516

Page 25: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

3105168

Page 26: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

31051684

Page 27: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

What do these two loops print?

n = 0

for c in 'forty-two':

if c not in 'aeiou':

n += 1

print n

7

n = 3while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1

310516842

Page 28: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

def min( L ): L is a list of numbers. def isPrime( n ): n is a positive integer

Page 29: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

L is a list of numbers. def isPrime( n ): n is a positive integerdef min( L ):

mn = L[0]

for i in range(1,len(L)):

if L[i] < mn:

mn = L[i]

return mn

Page 30: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

L is a list of numbers. def isPrime( n ): n is a positive integerdef min( L ):

mn = L[0]

for i in range(1,len(L)):

if L[i] < mn:

mn = L[i]

return mn

def min( L ):

mn=L[0]

for s in L:

if s < mn:

mn = s

return mn

Page 31: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

def min( L ):

mn = L[0]

for i in range(1,len(L)):

if L[i] < mn:

mn = L[i]

return mn

def min( L ):

mn=L[0]

for s in L:

if s < mn:

mn = s

return mn

L is a list of numbers. def isPrime( n ):

for i in range (n):

if i not in [0,1]:

if n%i == 0:

return False

return True

n is a positive integer

Page 32: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Consider the following update rule for all complex numbers c:

z0 = 0

zn+1 = zn2 + c

If z does not diverge, c is in the M. Set.

Real axis

Imaginary axis

c

the Mandelbrot Set

Benoit M.

z0

z1z2

z3

z4

Page 33: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Consider the following update rule for all complex numbers c:

z0 = 0

zn+1 = zn2 + c

If c does not diverge, it's in the M. Set.

Real axis

Imaginary axis

c

the Mandelbrot Set

Benoit M.

z0

z1z2

z3

z4

example of a non-diverging cycle

Page 34: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Consider the following update rule for all complex numbers c:

z0 = 0

zn+1 = zn2 + c

the Mandelbrot Set

The shaded area are points that do not diverge.

Page 35: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Python and images

for creating and saving imagesimport bmp.py

image = BitMap( 300, 200, Color.GREEN )

creates a bitmap objectand names it image

Page 36: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Python and images

for creating and saving imagesimport bmp.py

image = BitMap( 300, 200, Color.GREEN )

creates a bitmap objectand names it image

objects are software abstractions containing structured information

Page 37: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Python and images and objects

import bmp.py

image = BitMap( 300, 200, Color.GREEN )

here, a bitmap object named image is calling an internal method named saveFile

objects are variables that can contain their own functions, often called methods

image.saveFile( "test.bmp" )

Page 38: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Python and images and objects

from bmp import *

image = BitMap( 300, 200, Color.GREEN )

two more internal methods

objects are variables that can contain their own functions, often called methods

image.saveFile( "test.bmp" )

image.plotPixel( 150, 100 )

image.setPenColor( Color.Red )

Page 39: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Q: What does this plot?

from bmp import *

def test(): """ image demonstration """ width = 200 height = 200 image = BitMap( width, height )

# a 2d loop over each pixel for col in range(width):

for row in range(height):

if col == row:

image.plotPoint( col, row )

image.saveFile( "test.bmp" )

Page 40: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

Q: What does this plot?

A: A diagonal in the SW -> NE direction

from bmp import *

def test(): """ image demonstration """ width = 200 height = 200 image = BitMap( width, height )

# a 2d loop over each pixel for col in range(width):

for row in range(height):

if col == row:

image.plotPoint( col, row )

image.saveFile( "test.bmp" )

Page 41: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

How could you change this code so that it plots a diagonal from NW to SE?def test(): """ demonstrating images """ width = 200 height = 200 image = BitMap( width, height )

# a 2d loop over each pixel for col in range(width):

for row in range(height):

if col == row:

image.plotPoint( col, row )

image.saveFile( "test.bmp" )

Page 42: Loops ! We've seen variables change in-place before: [ x*6 for x in range(8) ] [ 0, 6, 12, 18, 24, 30, 36, 42 ] remember range ?

How could you change this code so that it plots a diagonal from NW to SE?def test(): """ demonstrating images """ width = 200 height = 200 image = BitMap( width, height )

# a 2d loop over each pixel for col in range(width):

for row in range(height):

if col == height – row -1:

image.plotPoint( col, row )

image.saveFile( "test.bmp" )