4.1. Conditional execution¶4.1.1. The if statement¶In order to write useful programs, we almost always need the ability to check conditions and change the behavior of the program accordingly. Conditional statements give us this ability. The simplest form is the if statement, which has the genaral form: Show
if BOOLEAN EXPRESSION: STATEMENTS A few important things to note about
Here is an example: food = 'spam' if food == 'spam': print('Ummmm, my favorite!') print('I feel like saying it 100 times...') print(100 * (food + '! ')) The boolean expression after the Run this example code and see what happens. Then change the value of Flowchart of an if statement As with the The indented statements that follow are called a block. The first unindented statement marks the end of the block. Each statement inside the block must have the same indentation. Indentation and the PEP 8 Python Style Guide The Python community has developed a Style Guide for Python Code, usually referred to simply as “PEP 8”. The Python Enhancement Proposals, or PEPs, are part of the process the Python community uses to discuss and adopt changes to the language. PEP 8 recommends the use of 4 spaces per indentation level. We will follow this (and the other PEP 8 recommendations) in this book. To help us learn to write well styled Python code, there is a program called pep8 that works as an automatic style guide checker for Python source code. In the Vim section of the appendix, Configuring Ubuntu for
Python Web Development, there is instruction on configuring vim to run 4.1.2. The if else statement¶It is frequently the case that you want one thing to happen when a condition it true, and something
else to happen when it is false. For that we have the if food == 'spam': print('Ummmm, my favorite!') else: print("No, I won't have it. I want spam!") Here, the first print statement will execute if Flowchart of a if else statement The syntax for an
if BOOLEAN EXPRESSION: STATEMENTS_1 # executed if condition evaluates to True else: STATEMENTS_2 # executed if condition evaluates to False Each statement inside the There is no limit on the number of statements that can appear under the two clauses of an if True: # This is always true pass # so this is always executed, but it does nothing else: pass Python terminology Python documentation sometimes uses the term suite of statements to mean what we have called a block here. They mean the same thing, and since most other languages and computer scientists use the word block, we’ll stick with that. Notice too that 4.2. Chained conditionals¶Sometimes there are more than two possibilities and we need more than two branches. One way to express a computation like that is a chained conditional: if x < y: STATEMENTS_A elif x > y: STATEMENTS_B else: STATEMENTS_C Flowchart of this chained conditional
if choice == 'a': print("You chose 'a'.") elif choice == 'b': print("You chose 'b'.") elif choice == 'c': print("You chose 'c'.") else: print("Invalid choice.") Each condition is checked in order. If the first is false, the next is checked, and so on. If one of them is true, the corresponding branch executes, and the statement ends. Even if more than one condition is true, only the first true branch executes. 4.3. Nested conditionals¶One conditional can also be nested within another. (It is the same theme of composibility, again!) We could have written the previous example as follows: Flowchart of this nested conditional if x < y: STATEMENTS_A else: if x > y: STATEMENTS_B else: STATEMENTS_C The outer conditional contains two branches. The second branch contains another Although the indentation of the statements makes the structure apparent, nested conditionals very quickly become difficult to read. In general, it is a good idea to avoid them when you can. Logical operators often provide a way to simplify nested conditional statements. For example, we can rewrite the following code using a single conditional: if 0 < x: # assume x is an int here if x < 10: print("x is a positive single digit.") The if 0 < x and x < 10: print("x is a positive single digit.") Note Python actually allows a short hand form for this, so the following will also work: if 0 < x < 10: print("x is a positive single digit.") 4.4. Iteration¶Computers are often used to automate repetitive tasks. Repeating identical or similar tasks without making errors is something that computers do well and people do poorly. Repeated execution of a set of statements is called iteration. Python has two statements for iteration – the Before we look at those, we need to review a few ideas. 4.4.1. Reassignmnent¶As we saw back in the Variables are variable section, it is legal to make more than one assignment to the same variable. A new assignment makes an existing variable refer to a new value (and stop referring to the old value). bruce = 5 print(bruce) bruce = 7 print(bruce) The output of this program is because the first time Here is what reassignment looks like in a state snapshot: With reassignment it is especially important to distinguish between an assignment statement and a boolean expression that tests
for equality. Because Python uses the equal token ( Note too that an equality test is symmetric, but assignment is not. For example, if Furthermore, in mathematics, a statement of equality is
always true. If a = 5 b = a # after executing this line, a and b are now equal a = 3 # after executing this line, a and b are no longer equal The third line changes the value of Note In some programming languages, a different symbol is used for assignment, such as 4.4.2. Updating variables¶When an assignment statement is executed, the right-hand-side expression (i.e. the expression that comes after the assignment token) is evaluated first. Then the result of that evaluation is written into the variable on the left hand side, thereby changing it. One of the most common forms of reassignment is an update, where the new value of the variable depends on its old value. The second line means “get the current value of n, multiply it by three and add one, and put the answer back into n as its
new value”. So after executing the two lines above, If you try to get the value of a variable that doesn’t exist yet, you’ll get an error: >>> w = x + 1 Traceback (most recent call last): File "<interactive input>", line 1, in NameError: name 'x' is not defined Before you can update a variable, you have to initialize it, usually with a simple assignment: This second statement — updating a variable by adding 1 to it — is very common. It is called an increment of the variable; subtracting 1 is called a decrement. 4.5. The for loop¶The Each item in turn is (re-)assigned to the loop variable, and the body of the loop is executed. The general
form of a for LOOP_VARIABLE in SEQUENCE: STATEMENTS This is another example of a compound statement in Python, and like the branching statements, it has a header terminated by a colon ( The loop variable is created when the This type of flow is called a loop because it loops back around to the top after each iteration. for friend in ['Margot', 'Kathryn', 'Prisila']: invitation = "Hi " + friend + ". Please come to my party on Saturday!" print(invitation) Running through all the items in a sequence is called traversing the sequence, or traversal. You should run this example to see what it does. Tip As with all the examples you see in this book, you should try this code out yourself and see what it does. You should also try to anticipate the results before you do, and create your own related examples and try them out as well. If you get the results you expected, pat yourself on the back and move on. If you don’t, try to figure out why. This is the essence of the scientific method, and is essential if you want to think like a computer programmer. Often times you will want a loop that iterates a
given number of times, or that iterates over a given sequence of numbers. The >>> for i in range(5): ... print('i is now:', i) ... i is now 0 i is now 1 i is now 2 i is now 3 i is now 4 >>> 4.6. Tables¶One of the things loops are good for is generating tables. Before computers were readily available, people had to calculate logarithms, sines and cosines, and other mathematical functions by hand. To make that easier, mathematics books contained long tables listing the values of these functions. Creating the tables was slow and boring, and they tended to be full of errors. When computers appeared on the scene, one of the initial reactions was, “This is great! We can use the computers to generate the tables, so there will be no errors.” That turned out to be true (mostly) but shortsighted. Soon thereafter, computers and calculators were so pervasive that the tables became obsolete. Well, almost. For some operations, computers use tables of values to get an approximate answer and then perform computations to improve the approximation. In some cases, there have been errors in the underlying tables, most famously in the table the Intel Pentium processor chip used to perform floating-point division. Although a log table is not as useful as it once was, it still makes a good example. The following program outputs a sequence of values in the left column and 2 raised to the power of that value in the right column: for x in range(13): # Generate numbers 0 to 12 print(x, '\t', 2**x) Using the tab character ( 0 1 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024 11 2048 12 4096 4.7. The while statement¶The general syntax for the while statement looks like this: while BOOLEAN_EXPRESSION: STATEMENTS Like the branching statements and the Here is a simple example: number = 0 prompt = "What is the meaning of life, the universe, and everything? " while number != "42": number = input(prompt) Notice that if Here is a more elaborate example program demonstrating the use of the
name = 'Harrison' guess = input("So I'm thinking of person's name. Try to guess it: ") pos = 0 while guess != name and pos < len(name): print("Nope, that's not it! Hint: letter ", end='') print(pos + 1, "is", name[pos] + ". ", end='') guess = input("Guess again: ") pos = pos + 1 if pos == len(name) and name != guess: print("Too bad, you couldn't get it. The name was", name + ".") else: print("\nGreat, you got it in", pos + 1, "guesses!") The flow of execution for a
The body consists of all of the statements below the header with the same indentation. The body of the loop should change the value of one or more variables so that eventually the condition becomes false and the loop terminates. Otherwise the loop will repeat forever, which is called an infinite loop. An endless source of amusement for computer programmers is the observation that the directions on shampoo, lather, rinse, repeat, are an infinite loop. In the case here, we can prove that the loop terminates because we know that
the value of What you will notice here is that the 4.8. Choosing between for and while¶So why have two kinds of loop if Use a So any problem like “iterate this weather model for 1000 cycles”, or “search this list of words”, “find all prime numbers up to 10000”
suggest that a By contrast, if you are required to repeat some computation until some condition is met, and you cannot calculate in advance when this will happen, as we did in the “greatest name” program, you’ll need a We call the first case definite iteration — we have some definite bounds for what is needed. The latter case is called indefinite iteration — we’re not sure how many iterations we’ll need — we cannot even establish an upper bound! 4.9. Tracing a program¶To write effective computer programs a programmer needs to develop the ability to trace the execution of a computer program. Tracing involves “becoming the computer” and following the flow of execution through a sample program run, recording the state of all variables and any output the program generates after each instruction is executed. To understand this process, let’s trace the execution of the program from The while statement section. At the start of the trace, we have a local variable, To keep track of all this as you hand trace a program, make a column heading on a piece of paper for each variable created as the program runs and another one for output. Our trace so far would look something like this: name guess pos output ---- ----- --- ------ 'Harrison' 'Maribel' 0 Since The user will now see Nope, that's not it! Hint: letter 1 is 'H'. Guess again:
Assuming the user enters name guess pos output ---- ----- --- ------ 'Harrison' 'Maribel' 0 Nope, that's not it! Hint: letter 1 is 'H'. Guess again: 'Harrison' 'Henry' 1 Nope, that's not it! Hint: letter 2 is 'a'. Guess again: A full trace of the program might produce something like this: name guess pos output ---- ----- --- ------ 'Harrison' 'Maribel' 0 Nope, that's not it! Hint: letter 1 is 'H'. Guess again: 'Harrison' 'Henry' 1 Nope, that's not it! Hint: letter 2 is 'a'. Guess again: 'Harrison' 'Hakeem' 2 Nope, that's not it! Hint: letter 3 is 'r'. Guess again: 'Harrison' 'Harold' 3 Nope, that's not it! Hint: letter 4 is 'r'. Guess again: 'Harrison' 'Harry' 4 Nope, that's not it! Hint: letter 5 is 'i'. Guess again: 'Harrison' 'Harrison' 5 Great, you got it in 6 guesses! Tracing can be a bit tedious and error prone (that’s why we get computers to do this stuff in the first place!), but it is an essential skill for a programmer to have. From a trace we can learn a lot about the way our code works. 4.10. Abbreviated assignment¶Incrementing a variable is so common that Python provides an abbreviated syntax for it: >>> count = 0 >>> count += 1 >>> count 1 >>> count += 1 >>> count 2
>>> n = 2 >>> n += 5 >>> n 7 There are similar abbreviations for >>> n = 2 >>> n *= 5 >>> n 10 >>> n -= 4 >>> n 6 >>> n //= 2 >>> n 3 >>> n %= 2 >>> n 1 4.11. Another while example: Guessing game¶The following program implements a simple guessing game: import random # Import the random module number = random.randrange(1, 1000) # Get random number between [1 and 1000) guesses = 0 guess = int(input("Guess my number between 1 and 1000: ")) while guess != number: guesses += 1 if guess > number: print(guess, "is too high.") elif guess < number: print(guess, " is too low.") guess = int(input("Guess again: ")) print("\n\nGreat, you got it in", guesses, "guesses!") This program makes use of the mathematical law of trichotomy (given real numbers a and b, exactly one of these three must be true: a > b, a < b, or a == b). 4.12. The break statement¶The break statement is used to immediately leave the body of its loop. The next statement to be executed is the first one after the body: for i in [12, 16, 17, 24, 29]: if i % 2 == 1: # if the number is odd break # immediately exit the loop print(i) print("done") This prints: 4.13. The continue statement¶This is a control flow statement that causes the program to immediately skip the processing of the rest of the body of the loop, for the current iteration. But the loop still carries on running for its remaining iterations: for i in [12, 16, 17, 24, 29, 30]: if i % 2 == 1: # if the number is odd continue # don't process it print(i) print("done") This prints: 4.14. Another for example¶Here is an example that combines several of the things we have learned: sentence = input('Please enter a sentence: ') no_spaces = '' for letter in sentence: if letter != ' ': no_spaces += letter print("You sentence with spaces removed:") print(no_spaces) Trace this program and make sure you feel confident you understand how it works. 4.15. Nested Loops for Nested Data¶Now we’ll come up with an even more adventurous list of structured data. In this case, we have a list of students. Each student has a name which is paired up with another list of subjects that they are enrolled for: students = [("Alejandro", ["CompSci", "Physics"]), ("Justin", ["Math", "CompSci", "Stats"]), ("Ed", ["CompSci", "Accounting", "Economics"]), ("Margot", ["InfSys", "Accounting", "Economics", "CommLaw"]), ("Peter", ["Sociology", "Economics", "Law", "Stats", "Music"])] Here we’ve assigned a list of five elements to the variable # print all students with a count of their courses. for (name, subjects) in students: print(name, "takes", len(subjects), "courses") Python agreeably responds with the following output: Aljandro takes 2 courses Justin takes 3 courses Ed takes 4 courses Margot takes 4 courses Peter takes 5 courses Now we’d like to ask how many students are taking CompSci. This needs a counter, and for each student we need a second loop that tests each of the subjects in turn: # Count how many students are taking CompSci counter = 0 for (name, subjects) in students: for s in subjects: # a nested loop! if s == "CompSci": counter += 1 print("The number of students taking CompSci is", counter) The number of students taking CompSci is 3
You should set up a list of your own data that interests you — perhaps a list of your CDs, each containing a list of song titles on the CD, or a list of movie titles, each with a list of movie stars who acted in the movie. You could then ask questions like “Which movies starred Angelina Jolie?” 4.16. List comprehensions¶A list comprehension is a syntactic construct that enables lists to be created from other lists using a compact, mathematical syntax: >>> numbers = [1, 2, 3, 4] >>> [x**2 for x in numbers] [1, 4, 9, 16] >>> [x**2 for x in numbers if x**2 > 8] [9, 16] >>> [(x, x**2, x**3) for x in numbers] [(1, 1, 1), (2, 4, 8), (3, 9, 27), (4, 16, 64)] >>> files = ['bin', 'Data', 'Desktop', '.bashrc', '.ssh', '.vimrc'] >>> [name for name in files if name[0] != '.'] ['bin', 'Data', 'Desktop'] >>> letters = ['a', 'b', 'c'] >>> [n * letter for n in numbers for letter in letters] ['a', 'b', 'c', 'aa', 'bb', 'cc', 'aaa', 'bbb', 'ccc', 'aaaa', 'bbbb', 'cccc'] >>> The general syntax for a list comprehension expression is: [expr for item1 in seq1 for item2 in seq2 ... for itemx in seqx if condition] This list expression has the same effect as: output_sequence = [] for item1 in seq1: for item2 in seq2: ... for itemx in seqx: if condition: output_sequence.append(expr) As you can see, the list comprehension is much more compact. 4.17. Glossary¶appendTo add new data to the end of a file or other data object. blockA group of consecutive statements with the same indentation. bodyThe block of statements in a compound statement that follows the header. branchOne of the possible paths of the flow of execution determined by conditional execution. chained conditionalA conditional branch with more than two possible flows of execution. In Python chained conditionals are written with A Python
statement that has two parts: a header and a body. The header begins with a keyword and ends with a colon ( Note We will use the Python standard of 4 spaces for each level of indentation. conditionThe boolean expression in a conditional statement that determines which branch is executed. conditional statementA statement that controls the flow of execution depending on some condition. In Python the keywords A variable used to count something, usually initialized to zero and incremented in the body of a loop. cursorAn invisible marker that keeps track of where the next character will be printed. decrementDecrease by 1. definite iterationA loop where we have an upper bound on the number of times the body will be executed. Definite iteration is usually best coded as a A sequence of one or more characters used to specify the boundary between separate parts of text. incrementBoth as a noun and as a verb, increment means to increase by 1. infinite loopA loop in which the terminating condition is never satisfied. indefinite iterationA loop where we just need to keep going until some condition is met. A To initialize a variable is to give it an initial value. Since in Python variables don’t exist until they are assigned values, they are initialized when they are created. In other programming languages this is not the case, and variables can be created without being initialized, in which case they have either default or garbage values. iterationRepeated execution of a set of programming statements. loopA statement or group of statements that execute repeatedly until a terminating condition is satisfied. loop variableA variable used as part of the terminating condition of a loop. nested loopA loop inside the body of another loop. nestingOne program structure within another, such as a conditional statement inside a branch of another conditional statement. newlineA special character that causes the cursor to move to the beginning of the next line. promptA visual cue that tells the user to input data. reassignmentMaking more than one assignment to the same variable during the execution of a program. tabA special character that causes the cursor to move to the next tab stop on the current line. trichotomyGiven any real numbers a and b, exactly one of the following relations holds: a < b, a > b, or a == b. Thus when you can establish that two of the relations are false, you can assume the remaining one is true. traceTo follow the flow of execution of a program by hand, recording the change of state of the variables and any output produced. What type of loop uses a Boolean expression?The while-loop uses a boolean test expression to control the run of the body lines.
What type of loop uses a Boolean expression to control the number of times that it repeats a statement or set of statements group of answer choices?A while loop is a control flow statement that allows code to be executed repeatedly based on a given Boolean condition.
Which type of loop causes a statement or set of statements to repeat a specific number of times?A loop is a control structure that causes a statement or group of statements to repeat. C++ has three looping control structures: the while loop, the do-while loop, and the for loop. A controlled loop contains some repetition condition which will eventually force the looping construct to terminate.
Which loop repeats a statement or set of statements as long as the Boolean expression is false do While do until For While none of these?A While loop repeats infinitely when there is no statement inside the loop body that makes the test condition false.
|