440 likes | 539 Views
EECS 110: Lec 10: Definite Loops and User Input. Aleksandar Kuzmanovic Northwestern University. http://cs.northwestern.edu/~akuzma/classes/EECS110-s09/. Loops !. We've seen variables change in-place before:. [ x*6 for x in range(8) ]. [ 0, 6, 12, 18, 24, 30, 36, 42 ].
E N D
EECS 110: Lec 10: Definite Loops and User Input Aleksandar Kuzmanovic Northwestern University http://cs.northwestern.edu/~akuzma/classes/EECS110-s09/
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! x is assigned each value from this sequence 1 for x in range(8): print'x is', x print'Phew!' 3 LOOP back to step 1 for EACH value in the list the BODY or BLOCK of the for loop runs with that x 2 Code AFTER the loop will not run until the loop is finished. 4
four on for for x in range(8): print'x is', x factorial function? sum the list? construct the list?
Fact with for def fact( n ): answer = 1 for x in range(n): answer = answer * x return answer
Fact with for def fact( n ): answer = 1 for x in range(1,n+1): answer = answer * x return answer
Accumulating an answer… Finding the sum of a list: def sum( L ): """ returns the sum of L's elements """ sum = 0 for x in L: sum = sum + x return sum Accumulator! shortcuts? vs. recursion? sum every OTHER element?
Shortcut Shortcuts for changing variables: age = 38 age = age + 1 age += 1 #shortcut for age = age + 1
Two kinds of for loops Element-based Loops sum = 0 for x in L: sum += x L = [ 42, -10, 4 ] x "selfless"
Two kinds of for loops Element-based Loops Index-based Loops sum = 0 for x in L: sum += x sum = 0 for i in : sum += i 1 2 0 L = [ 42, -10, 4 ] L = [ 42, -10, 4 ] x
Two kinds of for loops Element-based Loops Index-based Loops sum = 0 for x in L: sum += x sum = 0 for i inrange(len(L)): sum += L[i] i 1 2 0 L = [ 42, -10, 4 ] L = [ 42, -10, 4 ] x L[i]
Sum every other element Finding the sum of a list: def sum( L ): """ returns the sum of L's elements """ sum = 0 for i in range(len(L)): if ________: sum += L[i] return sum Accumulator! shortcuts? vs. recursion? sum every OTHER element?
Sum every other element Finding the sum of a list: 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 Accumulator! shortcuts? vs. recursion? sum every OTHER element?
Extreme Looping What does this code do? print'It keeps on' whileTrue: print'going and' print'Phew! I\'m done!'
Extreme Looping Anatomy of a while loop: the loop keeps on running as long as this test is True print'It keeps on' whileTrue: print'going and' print'Phew! I\'m done!' “while” loop This won't print until the while loop finishes - in this case, never! alternative tests?
Extreme Looping Slowing things down… import time print'It keeps on' whileTrue: print'going and' time.sleep(1) print'Phew! I\'m done!' the loop keeps on running as long as this test is True “while” loop
Making our escape! import random escape = 0 whileescape != 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?
Loops aren't just for lists… for c in'down with CS!': print c
Names: "Quiz" Write a loop to find and return the min of a list, L L is a list of numbers. def min( L ): What do these two loops print? n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn Write a loop so that this function returns True if its input is prime and False otherwise: n is a positive integer def isPrime( n ): n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn ??
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 ?? n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 10 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 10 5 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 10 5 16 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 10 5 16 8 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 10 5 16 8 4 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
What do these two loops print? n = 3 while n > 1: print n if n%2 == 0: n = n/2 else: n = 3*n + 1 3 10 5 16 8 4 2 n = 0 for c in'forty-two': if c not in'aeiou': n += 1 printn 7
def min( L ): L is a list of numbers. def isPrime( n ): n is a positive integer
def min( L ): mn = L[0] for i in range(1,len(L)): if L[i] < mn: mn = L[i] return mn L is a list of numbers. def isPrime( n ): n is a positive integer
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 ): n is a positive integer
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
Lab 8: the Mandelbrot Set 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. Benoit M. Imaginary axis z3 c z2 z1 z4 Real axis z0
Lab 8: the Mandelbrot Set 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. Benoit M. Imaginary axis z3 c z2 z1 z4 z0 Real axis example of a non-diverging cycle
Lab 8: the Mandelbrot Set Consider the following update rule for all complex numbers c: z0 = 0 zn+1 = zn2 + c The shaded area are points that do not diverge.
Python and images import bmp.py for creating and saving images image = BitMap( 300, 200, Color.GREEN ) creates a bitmap object and names it image
Python and images import bmp.py for creating and saving images image = BitMap( 300, 200, Color.GREEN ) creates a bitmap object and names it image objects are software abstractions containing structured information
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 image.saveFile( "test.bmp" ) objects are variables that can contain their own functions, often called methods
Python and images and objects import bmp.py image = BitMap( 300, 200, Color.GREEN ) image.setPenColor( Color.Red ) two more internal methods image.plotPixel( 150, 100 ) image.saveFile( "test.bmp" ) objects are variables that can contain their own functions, often called methods
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 inrange(width): for row inrange(height): if col == row: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
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 inrange(width): for row inrange(height): if col == row: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
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 inrange(width): for row inrange(height): if col == row: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
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 inrange(width): for row inrange(height): ifcol == height – row -1: image.plotPoint( col, row ) image.saveFile( "test.bmp" )