Introduction¶

In this chapter, you will learn just how to do the computer execute a team of declaration over and over as long as particular criterion holds. The team of statements being executed consistently is referred to as a loop. There room two loop declaration in Python: for and while. Us will talk about the difference in between these statements later on in the chapter, but an initial let us look at an example of a loop in the real world.

You are watching: Every high-level computer programming language contains a while statement.

A petrol attendant performs the complying with actions when serving a customer:

greet customerask because that required kind of petrol and also amountask whether customer demands other servicesask for required amount of moneygive money to cashierwait for adjust and receiptgive adjust and receipt to customersay thank you and also goodbye

A petrol attendant performs these steps for each customer, but he does not follow them when there is no customer to serve. He additionally only performs them as soon as it is his shift. If us were to compose a computer program come simulate this behaviour, it would not be sufficient just to carry out the steps and ask the computer system to repeat them over and also over. We would likewise need to tell it as soon as to stop executing them.

There are two significant kinds of programming loops: counting loops and event-controlled loops.

In a counting loop, the computer system knows in ~ the beginning of the loop execution how plenty of times it demands to execute the loop. In Python, this type of loop is defined with the because that statement, which executes the loop body for every items in part list.

In one event-controlled loop, the computer system stops the loop execution when a condition is no much longer true. In Python, you deserve to use the while statement because that this – it executes the loop human body while the condition is true. The while statement checks the problem before performing every iteration of the loop. Some languages also have a loop statement i beg your pardon performs the check after each iteration, so the the loop is constantly executed at the very least once. Python has actually no together construct, however we will view later exactly how you deserve to simulate one.

Counting loops space actually subset of event-control loop - the loop is recurring until the required number of iterations is reached.

If you wanted to obtain from Cape city to Camps Bay, what loop algorithm would you use? If you started by placing your car on the roadway to Camps Bay, friend could:

drive for specifically 15 minutes. After 15 minutes, avoid the car and get out.drive for exactly 8km. After 8km, avoid the car and also get out.drive as lengthy as you are not in Camps Bay. Once you arrive, protect against the car and get out.

The very first two algorithms are based upon counting – the first counts time, and also the 2nd counts distance. No of these algorithms guarantees that you will certainly arrive in Camps Bay. In the an initial case, you can hit hefty traffic or none at all, and either fall brief of or overshoot your wanted destination. In the 2nd case, you can find a detour and also end up nowhere near Camps Bay.

The third algorithm is event-controlled. You bring on control as long as you are not at the beach. The condition you keep checking is am i at the beach yet?.

Many real-life activities are event-controlled. For example, friend drink as long as you space thirsty. You read the newspaper as lengthy as you are interested. Some tasks are based upon multiple occasions – because that example, a worker works as lengthy as over there is job-related to do and the time is no 5pm.


The while statement¶

Python’s event-controlled loop statement is the if statement. You must use it once you don’t know beforehand how plenty of times girlfriend will have to execute the human body of the loop. The while-body keeps repeating as lengthy as the problem is true. Here’s a flow manage diagram because that the when statement:

\"*\"

The loop is composed of three necessary parts: the initialisation, the condition, and also the update. In the initialisation step, you set up the change which you’re going to usage in the condition. In the problem step, you carry out a check on the variable to watch whether you should terminate the loop or execute the body another time. Then, ~ each efficiently completed execution that the loop body, you upgrade your variable.

Note the the condition is checked prior to the loop human body is executed for the first time – if the problem is false in ~ the start, the loop human body will never ever be enforcement at all.

Here is a simple Python example which to add the first ten integers together:


The variable supplied in the loop condition is the number i, which you use to count the integers from 1 to 10. First you initialise this number come 1. In the condition, you inspect whether ns is much less than or same to 10, and if this is true friend execute the loop body. Then, at the end of the loop body, you update ns by incrementing it by 1.

It is really important that you increment i at the end. If girlfriend did not, ns would always be same to 1, the problem would constantly be true, and also your routine would never ever terminate – we contact this an unlimited loop. At any time you compose a when loop, make sure that the change you use in your condition is updated inside the loop body!

Here room a couple of common errors i beg your pardon might result in an unlimited loop:


x = 0while x 3: y += 1 # wrong variable updatedproduct = 1count = 1while count 10: product *= counting # forgot to update countx = 0while x 5: print(x)x += 1 # upgrade statement is indented one level also little, for this reason it's exterior the loop bodyx = 0while x != 5: print(x) x += 2 # x will never equal 5, due to the fact that we are counting in even numbers!
You could be wonder why the Python interpreter cannot capture infinite loops. This is well-known as the halting problem. It is impossible for a computer system to recognize all possible infinite loops in one more program. It is approximately the programmer come avoid limitless loops.

In countless of the instances above, we room counting come a predetermined number, for this reason it would really be an ext appropriate for us to use a because that loop (which will certainly be presented in the following section) – the is the loop structure which is more commonly provided for counting loops. Below is a much more realistic example:


# numbers is a list of number -- we don't recognize what the numbers are!total = 0i = 0while ns len(numbers) and also total 100: complete += numbers i +=1
Here we add up number from a list till the total reaches 100. Us don’t recognize how numerous times we will have to execute the loop, since we don’t recognize the worths of the numbers. Note that we could reach the finish of the list of numbers prior to the complete reaches 100 – if we try to accessibility an facet beyond the finish of the list we will acquire an error, so we should include a inspect to make sure that this doesn’t happen.


Exercise 1¶

Write a routine which supplies a if loop to sum the squares that integers (starting native 1) till the full exceeds 200. Publish the last total and the last number to it is in squared and added.Write a regimen which keeps prompting the user come guess a word. The user is allowed up come ten guesses – create your password in such a means that the secret word and the number of allowed guesses are basic to change. Publish messages to offer the user feedback.

The because that statement¶

Python’s various other loop explain is the for statement. You must use it as soon as you must do miscellaneous for some predefined variety of steps. Before we look at Python’s because that loop syntax, we will certainly briefly look in ~ the means for loops occupational in other languages.

Here is an example of a for loop in Java:


You deserve to see that this sort of for loop has a lot of in typical with a while loop – in fact, you might say that it’s just a special case of a while loop. The initialisation step, the condition and the update step space all defined in the section in bracket on the an initial line.

for loops are regularly used to carry out an procedure on every aspect of some sort of sequence. If you wanted to iterate end a list utilizing the classic-style for loop, girlfriend would need to count indigenous zero come the finish of the list, and then access each list facet by the index.

In Python, because that loops make this use case simple and straightforward by allowing you come iterate over sequences directly. Here is an instance of a for statement i beg your pardon counts indigenous 1 come 8:


As we witnessed in the ahead chapter, variety is an immutable sequence type used for varieties of integers – in this case, the range is counting native 1 come 8. The for loop will action through each of the number in turn, performing the print action for each one. When the finish of the selection is reached, the for loop will certainly exit.

You have the right to use for to iterate over various other kinds of assignment too. You can iterate over a list of strings like this:


At every iteration that the loop, the next facet of the list pets is assigned to the change pet, i beg your pardon you deserve to then accessibility inside the loop body. The example above is functionally identical to this:


That is comparable to the method for loops room written in, because that example, Java. You must avoid law this, together it’s more an overwhelming to read, and unnecessarily complex. If because that some factor you need the index inside the loop and the list facet itself, you have the right to use the enumerate function to number the elements:


Like range, enumerate likewise returns one iterator – every item the generates is a tuple in i m sorry the very first value is the index of the element (starting at zero) and the second is the element itself. In the loop above, at each iteration the worth of the index is assigned come the change i, and the aspect is assigned come the change pet, together before.

Why couldn’t we simply write pet = pet.upper()? that would just assign a new value to the variable pet within the loop, without changing the original list.

This brings us to a common for loop pitfall: editing a perform while you’re iterating over it. The example above only modifies aspects in-place, and also doesn’t adjust their order around, yet you can reason all kinds of errors and unintended behaviour if friend insert or delete list elements in the middle of iteration:


numbers = <1, 2, 2, 3>for i, num in enumerate(numbers): if num == 2: del numbersprint(numbers) # oops -- we missed one, because we change the elements around while us were iterating!
Sometimes you deserve to avoid this by iterating over a copy the the list instead, however it won’t help you in this situation – as you delete facets from the original list, it will certainly shrink, for this reason the indices indigenous the unmodified list copy will shortly exceed the length of the amendment list and you will get an error. In general, if you desire to choose a subset of elements from a perform on the communication of part criterion, you should use a list comprehension instead. We will look in ~ them in ~ the end of this chapter.


Exercise 2¶

Write a routine which sums the integers from 1 come 10 using a because that loop (and prints the full at the end).Can girlfriend think that a method to carry out this without using a loop?Write a regime which finds the factorial that a offered number. E.g. 3 factorial, or 3! is equal to 3 x 2 x 1; 5! is same to 5 x 4 x 3 x 2 x 1, etc.. Your program should only save on computer a single loop.Write a routine which prompts the user for 10 floating-point numbers and calculates your sum, product and average. Her program have to only save a solitary loop.Rewrite the previous regimen so the it has actually two loops – one i m sorry collects and also stores the numbers, and one which procedures them.

Nested loops¶

We experienced in the previous thing that we can develop multi-dimensional sequences – assignment in i beg your pardon each aspect is an additional sequence. Just how do we iterate over all the values of a multi-dimensional sequence? We should use loops inside other loops. As soon as we perform this, us say that we space nesting loops.

Consider the timetable instance from the previous chapter – let us say the the timetable includes seven days, and each day consists of 24 time slots. Each time slot is a string, which is empty if over there is nothing reserved for the slot. How have the right to we iterate over all the moment slots and print out all our booked events?


# an initial let's define weekday namesWEEKDAYS = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')# currently we iterate over each day in the timetablefor day in timetable: # and over every timeslot in every day for i, occasion in enumerate(day): if event: # if the slot is no an empty string print(\"%s at %02d:00 -- %s\" % (WEEKDAYS, i, event))
Note the we have two for loops – the inner loop will certainly be executed as soon as for every action in the external loop’s iteration. Additionally note the we are using the enumerate duty when iterating over the work – because we require both the table of contents of each time slot (so the we have the right to print the hour) and also the components of the slot.

You may have actually noticed that us look increase the name of the weekday once for every iteration that the inside loop – but the name only alters once because that every iteration that the external loop. We have the right to make ours loop a little much more efficient by moving this lookup out of the inside loop, so that we only perform it 7 times and not 168 times!


for work in timetable: day_name = WEEKDAYS because that i, occasion in enumerate(day): if event: print(\"%s at %02d:00 -- %s\" % (day_name, i, event))
This doesn’t make much difference when you room looking increase a value in a quick tuple, however it could make a huge difference if it were an expensive, time-consuming calculation and you were iterating end hundreds or thousands of values.


Exercise 3¶

Write a routine which supplies a nested because that loop to populate a three-dimensional list representing a calendar: the top-level list must contain a sub-list for each month, and also each month need to contain four weeks. Each week must be an empty list.Modify your password to make it simpler to accessibility a month in the calendar through a human-readable month name, and also each main by a name which is numbered starting from 1. Add an event (in the form of a cable description) to the second week in July.

Iterables, iterators and also generators¶

In Python, any kind which have the right to be iterated over v a because that loop is one iterable. Lists, tuples, strings and also dicts space all generally used iterable types. Iterating end a perform or a tuple simply way processing each value in turn.

Sometimes we usage a succession to save a series of worths which don’t monitor any details pattern: each value is unpredictable, and also can’t it is in calculated on the fly. In instances like this, we have actually no choice but to keep each value in a list or tuple. If the list is very large, this deserve to use up a many memory.

What if the values in our succession do monitor a pattern, and also can it is in calculated ~ above the fly? We deserve to save a lot of memory by calculating worths only as soon as we need them, instead of calculating them every up-front: instead of storing a huge list, we can store just the details we require for the calculation.

Python has actually a lot of of built-in iterable types that generate worths on demand – lock are often referred to as generators. We have already seen some examples, like variety and enumerate. You can mostly treat a generator just like any other succession if friend only need to access its aspects one at a time – because that example, if you usage it in a because that loop:


# These two loops will do exactly the exact same thing:for i in (1, 2, 3, 4, 5): print(i)for i in range(1, 6): print(i)
You may notice a difference if you shot to print out the generator’s materials – through default all you will gain is Python’s conventional string representation of the object, which reflects you the object’s kind and its unique identifier. To publish out all the worths of generator, we require to transform it to a sequence kind like a list, which will force every one of the worths to be generated:


# this will certainly not be really helpfulprint(range(100))# this will present you all the generated valuesprint(list(range(100)))
You can use every these iterables nearly interchangeably due to the fact that they all use the same user interface for iterating end values: every iterable object has a technique which have the right to be supplied to return one iterator over the object. The iterable and also the iterator together type a continual interface which deserve to be offered to loop end a succession of worths – even if it is those values space all stored in storage or calculated as they space needed:

The iterable has a technique for accessing things by that is index. For example, a list just returns the items which is save in a particular position. A range, ~ above the other hand, calculates the integer in the variety which corresponds to a particular index.

The iterator “keeps your place” in the sequence, and has a method which allows you accessibility the following element. There can be many iterators linked with a solitary iterable at the very same time – each one in a different place in the iteration. For example, you can iterate end the exact same list in both levels of a nested loop – each loop offers its own iterator, and also they carry out not interfere with each other:


animals = <'cat', 'dog', 'fish'>for first_animal in animals: because that second_animal in animals: print(\"Yesterday i bought a %s. This day I to buy a %s.\" % (first_animal, second_animal))
We will certainly look in an ext detail at exactly how these approaches are characterized in a later on chapter, when we discuss writing tradition objects. For now, here are some an ext examples of integrated generators defined in Python’s itertools module:


# we need to import the module in stimulate to usage itimport itertools# uneven range, counting doesn't have an top bound, and also is not minimal to integersfor i in itertools.count(1): print(i) # 1, 2, 3....for i in itertools.count(1, 0.5): print(i) # 1.0, 1.5, 2.0....# cycle repeats the values in one more iterable over and also overfor pet in itertools.cycle(<'cat', 'dog'>): print(animal) # 'cat', 'dog', 'cat', 'dog'...# repeat repeats a single itemfor ns in itertools.repeat(1): # ...forever print(i) # 1, 1, 1....for ns in itertools.repeat(1, 3): # or a set variety of times print(i) # 1, 1, 1# chain combine multiple iterables sequentiallyfor i in itertools.chain(numbers, animals): print(i) # publish all the numbers and then every the animals
Some of these generators have the right to go on for ever, for this reason if you use them in a for loop girlfriend will need some other check to do the loop terminate!

There is likewise a built-in function called zip which allows us to combine multiple iterables pairwise. It additionally outputs a generator:


for i in zip((1, 2, 3), (4, 5, 6)): print(i)for ns in zip(range(5), range(5, 10), range(10, 15)): print(i)
The combined iterable will be the same size as the shortest of the ingredient iterables – if any kind of of the component iterables are longer than that, your trailing elements will be discarded.


Exercise 4¶

Create a tuple that month names and also a tuple that the number of days in each month (assume the February has actually 28 days). Utilizing a solitary for loop, construct a dictionary which has the month names together keys and the matching day numbers as values.Now do the exact same thing without using a because that loop.

Comprehensions¶

Suppose the we have actually a perform of numbers, and also we want to build a new list through doubling every the values in the first list. Or the we desire to extract every the even numbers from a perform of numbers. Or that we want to find and capitalise all the pet names in a list of animal names that begin with a vowel. We deserve to do each of these things by iterating over the original list, performing some kind of inspect on each element in turn, and also appending worths to a new list together we go:


numbers = <1, 5, 2, 12, 14, 7, 18>doubles = <>for number in numbers: doubles.append(2 * number)even_numbers = <>for number in numbers: if number % 2 == 0: even_numbers.append(number)animals = <'aardvark', 'cat', 'dog', 'opossum'>vowel_animals = <>for pet in animals: if animal<0> in 'aeiou': vowel_animals.append(animal.title())
That’s quite an unwieldy method to carry out something an extremely simple. Fortunately, we can rewrite simple loops favor this to usage a cleaner and an ext readable syntax by making use of comprehensions.

A comprehension is a sort of filter which we can specify on one iterable based on some condition. The an outcome is one more iterable. Below are some examples of list comprehensions:


doubles = <2 * number for number in numbers>even_numbers = vowel_animals = in 'aeiou'>
The comprehension is the part written between square base on each line. Every of these comprehensions results in the creation of a new list object.

You can think the the comprehension as a compact type of because that loop, which has been rearranged slightly.

The an initial part (2 * number or number or animal.title()) defines what is going come be placed into the brand-new list at each action of the loop. This is normally some role of each item in the initial iterable together it is processed.The middle part (for number in numbers or for pet in animals) corresponds to the an initial line the a because that loop, and defines what iterable is gift iterated over and also what variable surname each items is given inside the loop.The last component (nothing or if number % 2 == 0 or if animal<0> in \"aeiou\") is a problem which filters out some of the initial items. Only items because that which the condition is true will certainly be handle (as explained in the very first part) and also included in the brand-new list. You don’t have actually to encompass this part – in the first example, we want to double all the number in the original list.

List comprehensions can be supplied to replace loops that room a lot of more complex than this – even nested loops. The more complicated the loop, the more complex the matching list comprehension is most likely to be. A long and also convoluted list comprehension can be very daunting for someone analysis your password to know – periodically it’s much better just to compose the loop out in full.

The last product the a comprehension doesn’t need to be a list. Girlfriend can create dictionaries or generators in a very similar means – a generator expression uses round brackets instead of square brackets, a collection comprehension uses curly brackets, and also a dict understanding uses curly brackets and the end the vital and the value using a colon:


numbers = <1, 5, 2, 12, 14, 7, 18># a generator comprehensiondoubles_generator = (2 * number for number in numbers)# a set comprehensiondoubles_set = 2 * number because that number in numbers# a dict understanding which uses the number together the key and the double number together the valuedoubles_dict = number: 2 * number for number in numbers
If her generator expression is a parameter gift passed come a function, favor sum, you deserve to leave the ring brackets out:


Exercise 5¶

Create a cable which consists of the first ten optimistic integers be separated by commas and spaces. Remember that you can’t join numbers – you have actually to convert them come strings first. Print the calculation string.Rewrite the calendar program from practice 3 utilizing nested comprehensions rather of nested loops. Shot to append a cable to one of the main lists, come make sure that you haven’t reused the very same list rather of developing a separate list for each week.Now do something comparable to produce a calendar i m sorry is a list with 52 north sublists (one because that each week in the whole year). Hint: how would you modify the nested for loops?
This fragment will print all the numbers from 1 come 10 except 5. In the case where x is 5, the proceed statement will be encountered, and the flow of regulate will leave that loop body – however then the loop will continue through the next element in the range.

Note that if we replaced break with proceed in the first example, us would get an limitless loop – since the continue statement would certainly be triggered before x can be updated. X would stay equal to 5, and keep triggering the proceed statement, for ever!


Using break to simulate a do-while loop¶

Recall the a if loop check the condition before executing the loop body because that the very first time. Periodically this is convenient, yet sometimes it’s not. What if you always need to execute the loop body at least once?


age = input(\"Please get in your age: \")while not valid_number(age): # let's assume that we've defined valid_number somewhere else age = input(\"Please go into your age: \")
We need to ask the user for input at the very least once, since the condition depends ~ above the user entry – therefore we need to do it once outside the loop. This is inconvenient, due to the fact that we have to repeat the components of the loop body – and unnecessary repeat is generally a poor idea. What if we desire to adjust the article to the user later, and forget to readjust it in both places? What if the loop body has many currently of code?

Many various other languages market a structure dubbed a do-while loop, or a repeat-until loop, which checks the condition after executing the loop body. That means that the loop body will constantly be executed at the very least once. Python doesn’t have a structure prefer this, yet we deserve to simulate it v the aid of the break statement:


We have moved the problem inside the loop body, and also we can inspect it at the end, after asking the user because that input. We have actually replaced the problem in the if statement v True – which is, of course, always true. Now the if statement will never terminate after check the condition – it deserve to only terminate if the break statement is triggered.

This trick can assist us to do this details loop use instance look better, yet it has its disadvantages. If we accidentally leave out the break statement, or compose the loop in such a means that it can never it is in triggered, we will have actually an unlimited loop! This password can additionally be more challenging to understand, because the actual problem which renders the loop terminate is surprise inside the body of the loop. Friend should thus use this build sparingly. Periodically it’s feasible to rewrite the loop in together a means that the condition can it is in checked before the loop human body and repeat is avoided:


age = no one # we deserve to initialise age to something which is not a precious numberwhile not valid_number(age): # now we have the right to use the condition before asking the user anything age = input(\"Please go into your age: \")

Exercise 6¶

Write a regime which repeatedly prompts the user because that an integer. If the creature is even, print the integer. If the essence is odd, don’t publish anything. Leave the routine if the user enters the essence 99.

Some programs ask the user come input a variable variety of data entries, and finally to enter a particular character or wire (called a sentinel) i m sorry signifies the there space no more entries. For example, you could be request to enter your PIN followed by a hash (#). The hash is the sentinel which suggests that you have actually finished entering your PIN.

Write a program which averages confident integers. Her program should prompt the user to get in integers till the user enters a an adverse integer. The an adverse integer should be discarded, and also you must print the mean of all the previously gotten in integers.

Implement a simple calculator v a menu. Display screen the following choices to the user, prompt because that a selection, and carry out the requested activity (e.g. Note for two numbers and include them). After each operation, return the user come the menu. Departure the program when the user selects 0. If the user beginning a number i beg your pardon is no in the menu, neglect the input and also redisplay the menu. You can assume that the user will get in a precious integer:


-- Calculator food selection --0. Quit1. Include two numbers2. Subtract 2 numbers3. Multiply 2 numbers4. Divide 2 numbers
There’s a many repetition in this snippet of code. Each line is exactly the same other than for the name of the variable and the surname of the home we ask for (and these values complement each other, therefore there’s really only one difference). Once we write code prefer this we’re likely to do a lot of copying and pasting, and also it’s easy to make a mistake. If we ever before want to change something, we’ll need to readjust each line.

How can we enhance on this? We have the right to separate the components of this lines that differ indigenous the parts that don’t, and use a loop come iterate end them. Instead of storing the user intake in separate variables, we are going to usage a dictionary – us can conveniently use the residential property names as keys, and it’s a sensible means to team these values:


person = for prop in <\"name\", \"surname\", \"age\", \"height\", \"weight\">: person = input(\"Please go into your %s: \" % prop)
Now there is no unnecessary duplication. We can easily readjust the string the we usage as a prompt, or add much more code come execute because that each building – we will certainly only have to edit the code in one place, no in 5 places. To add another property, all we need to do is add another name to the list.

See more: Overwatch First Win Of The Day Reset, First Win Of The Day


Exercise 7¶

Modify the example above to include type conversion that the properties: age should it is in an integer, height and weight should be floats, and name and also surname have to be strings.