Loops Introduction to Computing Science and Programming I Loops To this point you’ve learned how to write code that executes from top to bottom as well as how to use conditional (if) statements to select or skip parts of the code. Loop structures allow the programmer to have sections of code executed multiple times. This allows many programs that couldn’t be written without loops as well as making many programs that can be written without loops, more simple. Algorithms With Loops Before getting into how to write the loops themselves, let’s look at some problems that require loops. Prime Number Algorithm Here’s an algorithm we looked at previously to test whether a user input number is prime. set divisor to 2 write “Enter an integer greater than 2” read userNumber repeat while divisor2 < userNumber if userNumber % divisor is equal to 0 write “The number is not prime, it is divisible by :” write divisor exit program set divisor to divisor +1 write “The number is prime.” Prime Number Algorithm Notice that we have a section of the algorithm we want to repeat repeat while divisor2 < userNumber if userNumber % divisor is equal to 0 write “The number is not prime, it is divisible by :” write divisor exit program set divisor to divisor +1 The algorithm wants to repeat the indented section of code while (divisor2 < userNumber) Algorithms A couple simpler algorithms that will need to repeat code. Factorial n! = n * (n-1) * (n-2) *…*2 * 1 5! = 5 * 4 * 3 * 2 * 1 = 120 Algorithm write “Enter a nonnegative integer:” read n set factorial to 1 do this for i equal to each number from 1 to n: set factorial to factorial * i write factorial Notice the code that will be repeated, but this time it is stated differently. Instead of repeat while this is true, it says do this this many times. A Couple More Algorithms Repeatedly prompting a user until they give proper input set number to 0 repeat while number < 1 write “Enter a positive integer: “ read number Printing out the powers of 2 write “How many powers of 2 should be printed?” read max set value to 1 do this max times write value set value to value * 2 Two Kinds of Loop while loops These are called indefinite loops because they are often used to repeat code without knowing how many times it will be repeated beforehand. for loops These are called definite loops because they usually will repeat a set number of times while Loops while condition: code block Similar to an if statement, a while loop is given a condition (boolean expression). The code block associated with the while loop will repeat over and over again until the condition becomes false. while Loops A simple example that prints the number 1 through 3. num = 1 while num <= 3: print num num = num + 1 print “Finished” When the while statement is reached the first time, num is 1 which is less than five. Therefore execution enters the code block and repeats the code block until num is greater than 5 while Loops Unwinding the loop To understand what’s going on we can ‘unwind’ the loop num = 1 while num <= 3: print num num = num + 1 print “Finished” num = 1 Check the condition, is num <=3? print num num = num + 1 (num is 2) Check the condition, is num <= 3? print num num = num + 1 (num is 3) Check the condition, is num <= 3? print num num = num + 1 (num is 4) Check the condition, is num <= 3? print “Finished” Yes, so enter the code block Yes, so repeat the code block Yes, so repeat the code block No, so skip the code block while Loops Remember that the condition is checked before the block of code is executed for the first time. Therefore, the code in a while loop may never be executed. You also need to make sure the condition eventually becomes false, if not you will have an infinite loop. The program will never leave the while loop and never finish while Loops while loops are an easy way to wait for proper input from the user number = 0 while number < 1: number = int(raw_input(“Enter a positive integer: “)) print “Your number is “ + str(number) for Loops For the time being all of the for loops we look at will look something like this for x in range(5): print x We’ll learn more general uses of it, but for now the for statement will be of the form for varname in range(..): Here we just have the single statement ‘print x’ inside the loop, but you have any sized code block you like range Function range is a Python function that returns a list of numbers If you give range one argument, it returns a list of integers starting at 0, ending at one less than the argument You can also give range a beginning and ending number. The list starts at the first argument and ends at one less than the second argument. range(4) = [0, 1, 2, 3] range(10) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] range(1,5) = [1, 2, 3, 4] range(-2,2) = [-2, -1, 0, 1] range(0,4) = range(4) We will learn about the list data type and how to create our own lists later for Loops What the for loop does is assign the values returned by range to the variable one by one and executes the code block for each value for x in range(5): print x x will be assigned the 5 values in range, and those values will be printed for Loops Unwinding a for loop for x in range(5): print x Remember, range(5) = {0,1,2,3,4} x=0 (first value in range(5)) print x x=1 (second value in range(5)) print x x=2 (third value in range(5)) print x x=3 (fourth value in range(5)) print x x=4 (final value in range(5)) print x No more values remain in range(5) so we are finished for Loops You can just use the structure to repeat code a certain number of times, ignoring the value assigned to the variable in the for statement Printing out the powers of 2 max = int(raw_input("How many powers of 2 should be printed? ")) num = 1; for i in range(max): print num num = num * 2 Notice that the values in range(max) will be assigned to i, but we don’t use i inside the loop. We’re just using the structure to repeat the code block max times. for Loops Unwinding a for loop Assume a user entered 3 in the last example num = 1 for i in range(max): //max previously set to 3 print num num = num * 2 Remember, range(3) = {0,1,2} i=0 (first value in range(3)) print num (num is 1) num = num * 2 (num is 2) i=1 (second value in range(3)) print num num = num * 2 (num is 4) i=2 (third and last value in range(3)) print num num = num * 2 (num is 8) No values remain in range(3) so the loop is complete for Loops Factorial Example n = int( raw_input("Enter a nonnegative integer: ") ) factorial = 1 for i in range(n): factorial = factorial * (i+1) print factorial for Loops range(n) returns {0,1,2…,n}, but you may want to use the integers starting at 1 Print the first 5 positive integers for num in range(5): print num+1 num is set to 0,1,2… but we offset it by one in the for loop to get the numbers we desired We could also have used range(1,6) in this case for Loops Extending that idea Print the first 5 positive even numbers for num in range(5): print 2*(num+1) Print the first 5 positive odd numbers for num in range(5): print 2*num + 1 Print the first 5 positive numbers squared for num in range(5): print num**2 Print the first 5 powers of 2 for num in range(5): print 2**num Nesting The code block inside a loop (or if structure) can contain loops (or if structures) itself. This is called nesting loops. As you get into more complex programs these nested structures become commonplace Nesting Nested for loops to print a block of 0s for row in range(4): for col in range(5): print 0, print “” Output 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 If you put a comma at the end of a print statement ‘print 0,’ it will not go to the next line after printing Nesting Another nested for loop example that prints out the coordinates (row,col) of each location in a grid with (0,0) being the upper left-hand corner.. for row in range(4): for col in range(6): print "(" +str(row) + "," + str(col) + ")", print “” Output: (0,0) (1,0) (2,0) (3,0) (0,1) (1,1) (2,1) (3,1) (0,2) (1,2) (2,2) (3,2) (0,3) (1,3) (2,3) (3,3) (0,4) (1,4) (2,4) (3,4) (0,5) (1,5) (2,5) (3,5) Nesting Another nested for loop example that prints out the coordinates (row,col) of each location in a grid. for row in range(4): for col in range(6): print "(" +str(row) + "," + str(col) + ")", print “” Remember that the inner for loop is run from start to end every time the code block for the outer for loop is run Each time one of the values in range(4) is assigned to row, every value in range(6) will be assigned to col Nesting Nested loops to find the average of different students grades count = 0 name = raw_input("Enter student's name, enter nothing to quit: ") while name!= "": count = count + 1 totalScore=0 for i in range(3): totalScore=totalScore + int(raw_input("Assignment " + str(i+1) + " score: ")) print name + "'s average is " + str(round(totalScore/3.0)) + "." name = raw_input("Enter student's name, enter nothing to quit: ") print "You entered the grades of " + str(count) + " student(s)" Deciding Which Control Structure To Use You have code that only needs to run in certain situations if statement Absolute value num = int(raw_input(“Enter number: “)) if num < 0: num = -num print “Absolute value is “ + str(num) Deciding Which Control Structure To Use You have two chunks of code, one or the other of which should run every time if – else structure num = int(raw_input(“Enter a number: “)) if (num % 2) == 0: print “You entered an even number.” else: print “You entered an odd number.” Deciding Which Control Structure To Use You have more than two chunks of code, with one and only one of which that should run each time. if-elif-else structure temp = int(raw_input(“Enter the temperature: “)) if temp > 25: print “It is hot today.” elif temp > 15: print “It is warm today.” elif temp > 5: print “It is cool today.” else: print “It is cold today.” Deciding Which Control Structure To Use You have code that needs to be repeated for or while loop There are many cases where either type of loop can be used, but there are general rules. If you know how many times a loop is going to repeat, usually a for loop is best. You may only know the repetitions based on user input or some other variable. If you need to keep repeating something until some process is finished/goal is met In Class Exercise Write a short program that reads some user entered text, and outputs whether there is a repeated character in the string. e.g. “aa”, “speed”, but not “banana” if text is a variable containing a string len(text) tells you how many characters it has text[0] gives you the first character, text[1] the second and text[len(text) – 1] the last Write a short program that prints out an NxN multiplication table where N is entered by the user If 1 2 3 the 2 4 6 user entered 3 the table should be. 3 6 9 In Class Exercise This could also be done with a while loop #Find a repeated character text = raw_input("Enter text: ") found = False #will be set to true if we find a repeated character for index in range(len(text)-1): if text[index] == text[index+1]: print "Repeated character found: "+text[index] found = True if not found: print "No repeats found" In Class Exercise size = int(raw_input(“How many rows/colums? “)) for row in range(size): for col in range(size): print (row+1) * (col+1), print We need to use row+1 and col+1 since we want to start at 0, not 1 Remember that the comma at the end of the print statement prevents it from proceeding to the next line print without anything after ends the line In Class Exercise What does the code print out? count = int(raw_input("Enter the max: ")) for row in range(count): line = "" for i in range(count-row-1): line = line + " “ for i in range(row+1): line = line + str(i+1) for i in range(row): line = line + str(row-i) print line In Class Exercise The outer loop is pretty clearly printing out one line for each iteration, the inner loops are adding text to that line. Take each inner loop individually for i in range(count-row-1): line = line + " “ Assume count is 5. For each value of row, this will add count-row-1 spaces. row will be assigned the values 0,1,2…count – 1 Therefore, on the first line this adds count-1 spaces, count-2 on the second, … , and none on the last In Class Exercise for i in range(row+1): line = line + str(i+1) For each value of row this will add the numbers 1,2,3…row+1 to the current line for i in range(row): line = line + str(row-i) For each value of row this will add the numbers row,row-1,row-2…,1 to the current line Combining these two, the first line will get 1, the second, 121, the third, 12321, and so on In Class Exercise Combining all of this, we see a pyramid of numbers printed out The first inner for loop adds the spaces at the left, the second for loop adds the increasing number, the last adds the decreasing numbers 1 121 12321 1234321 123454321