A Practical Introduction to Python Programming PDF

Summary

This textbook, "A Practical Introduction to Python Programming," by Brian Heinold, is a comprehensive guide to Python programming. The book covers fundamental concepts, including looping, numbers, and conditional statements, as well as more advanced topics like object-oriented programming and graphics. It provides numerous examples and exercises to reinforce learning.

Full Transcript

A Practical Introduction to Python Programming Brian Heinold Department of Mathematics and Computer Science Mount St. Mary’s University ii ©2012 Brian Heinold Licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported Li- cense Contents I...

A Practical Introduction to Python Programming Brian Heinold Department of Mathematics and Computer Science Mount St. Mary’s University ii ©2012 Brian Heinold Licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported Li- cense Contents I Basics 1 1 Getting Started 3 1.1 Installing Python.............................................. 3 1.2 IDLE...................................................... 3 1.3 A first program............................................... 4 1.4 Typing things in............................................... 5 1.5 Getting input................................................. 6 1.6 Printing.................................................... 6 1.7 Variables................................................... 7 1.8 Exercises................................................... 9 2 For loops 11 2.1 Examples................................................... 11 2.2 The loop variable.............................................. 13 2.3 The range function............................................ 13 2.4 A Trickier Example............................................. 14 2.5 Exercises................................................... 15 3 Numbers 19 3.1 Integers and Decimal Numbers.................................... 19 3.2 Math Operators............................................... 19 3.3 Order of operations............................................ 21 3.4 Random numbers............................................. 21 3.5 Math functions............................................... 21 3.6 Getting help from Python........................................ 22 3.7 Using the Shell as a Calculator..................................... 22 3.8 Exercises................................................... 23 4 If statements 27 4.1 A Simple Example............................................. 27 4.2 Conditional operators........................................... 28 4.3 Common Mistakes............................................. 28 4.4 elif...................................................... 29 4.5 Exercises................................................... 30 iii iv CONTENTS 5 Miscellaneous Topics I 33 5.1 Counting................................................... 33 5.2 Summing................................................... 34 5.3 Swapping................................................... 35 5.4 Flag variables................................................ 36 5.5 Maxes and mins............................................... 36 5.6 Comments.................................................. 37 5.7 Simple debugging............................................. 37 5.8 Example programs............................................. 38 5.9 Exercises................................................... 40 6 Strings 43 6.1 Basics...................................................... 43 6.2 Concatenation and repetition...................................... 44 6.3 The in operator............................................... 44 6.4 Indexing.................................................... 45 6.5 Slices...................................................... 45 6.6 Changing individual characters of a string............................. 46 6.7 Looping.................................................... 46 6.8 String methods............................................... 47 6.9 Escape characters.............................................. 48 6.10 Examples................................................... 49 6.11 Exercises................................................... 51 7 Lists 57 7.1 Basics...................................................... 57 7.2 Similarities to strings........................................... 58 7.3 Built-in functions.............................................. 59 7.4 List methods................................................. 59 7.5 Miscellaneous................................................ 60 7.6 Examples................................................... 60 7.7 Exercises................................................... 62 8 More with Lists 65 8.1 Lists and the random module..................................... 65 8.2 split..................................................... 66 8.3 join...................................................... 67 8.4 List comprehensions............................................ 68 8.5 Using list comprehensions........................................ 69 8.6 Two-dimensional lists........................................... 70 8.7 Exercises................................................... 72 CONTENTS v 9 While loops 75 9.1 Examples................................................... 75 9.2 Infinite loops................................................. 78 9.3 The break statement........................................... 78 9.4 The else statement............................................. 79 9.5 The guessing game, more nicely done................................ 80 9.6 Exercises................................................... 83 10 Miscellaneous Topics II 87 10.1 str, int, float, and list..................................... 87 10.2 Booleans.................................................... 89 10.3 Shortcuts................................................... 90 10.4 Short-circuiting............................................... 91 10.5 Continuation................................................. 91 10.6 pass...................................................... 91 10.7 String formatting.............................................. 92 10.8 Nested loops................................................. 93 10.9 Exercises................................................... 95 11 Dictionaries 99 11.1 Basics...................................................... 99 11.2 Dictionary examples............................................ 100 11.3 Working with dictionaries........................................ 101 11.4 Counting words............................................... 102 11.5 Exercises................................................... 104 12 Text Files 109 12.1 Reading from files............................................. 109 12.2 Writing to files................................................ 110 12.3 Examples................................................... 110 12.4 Wordplay................................................... 111 12.5 Exercises................................................... 113 13 Functions 119 13.1 Basics...................................................... 119 13.2 Arguments.................................................. 120 13.3 Returning values.............................................. 121 13.4 Default arguments and keyword arguments............................ 122 13.5 Local variables............................................... 123 13.6 Exercises................................................... 125 14 Object-Oriented Programming 129 14.1 Python is objected-oriented....................................... 129 14.2 Creating your own classes........................................ 130 14.3 Inheritance.................................................. 132 14.4 A playing-card example......................................... 133 vi CONTENTS 14.5 A Tic-tac-toe example........................................... 136 14.6 Further topics................................................ 138 14.7 Exercises................................................... 138 II Graphics 141 15 GUI Programming with Tkinter 143 15.1 Basics...................................................... 143 15.2 Labels..................................................... 144 15.3 grid...................................................... 145 15.4 Entry boxes.................................................. 146 15.5 Buttons.................................................... 146 15.6 Global variables............................................... 148 15.7 Tic-tac-toe................................................... 149 16 GUI Programming II 155 16.1 Frames..................................................... 155 16.2 Colors..................................................... 156 16.3 Images..................................................... 157 16.4 Canvases................................................... 158 16.5 Check buttons and Radio buttons................................... 159 16.6 Text widget................................................. 160 16.7 Scale widget................................................ 161 16.8 GUI Events.................................................. 162 16.9 Event examples............................................... 164 17 GUI Programming III 169 17.1 Title bar.................................................... 169 17.2 Disabling things............................................... 169 17.3 Getting the state of a widget....................................... 169 17.4 Message boxes................................................ 170 17.5 Destroying things.............................................. 171 17.6 Updating................................................... 171 17.7 Dialogs.................................................... 172 17.8 Menu bars.................................................. 174 17.9 New windows................................................ 174 17.10 pack...................................................... 175 17.11 StringVar................................................. 175 17.12More with GUIs............................................... 176 18 Further Graphical Programming 177 18.1 Python 2 vs Python 3........................................... 177 18.2 The Python Imaging Library...................................... 179 18.3 Pygame.................................................... 182 CONTENTS vii III Intermediate Topics 183 19 Miscellaneous topics III 185 19.1 Mutability and References........................................ 185 19.2 Tuples..................................................... 187 19.3 Sets....................................................... 187 19.4 Unicode.................................................... 189 19.5 sorted.................................................... 190 19.6 if-else operator............................................. 190 19.7 continue.................................................. 190 19.8 eval and exec.............................................. 191 19.9 enumerate and zip.......................................... 192 19.10 copy...................................................... 193 19.11More with strings.............................................. 194 19.12Miscellaneous tips and tricks...................................... 195 19.13Running your Python programs on other computers...................... 196 20 Useful modules 199 20.1 Importing modules............................................ 199 20.2 Dates and times............................................... 200 20.3 Working with files and directories................................... 202 20.4 Running and quitting programs.................................... 204 20.5 Zip files.................................................... 204 20.6 Getting files from the internet...................................... 205 20.7 Sound..................................................... 205 20.8 Your own modules............................................. 206 21 Regular expressions 207 21.1 Introduction................................................. 207 21.2 Syntax..................................................... 208 21.3 Summary................................................... 212 21.4 Groups..................................................... 214 21.5 Other functions............................................... 214 21.6 Examples................................................... 216 22 Math 219 22.1 The math module............................................. 219 22.2 Scientific notation............................................. 220 22.3 Comparing floating point numbers.................................. 221 22.4 Fractions................................................... 221 22.5 The decimal module.......................................... 222 22.6 Complex numbers............................................. 224 22.7 More with lists and arrays........................................ 226 22.8 Random numbers............................................. 226 22.9 Miscellaneous topics............................................ 228 viii CONTENTS 22.10Using the Python shell as a calculator................................ 229 23 Working with functions 231 23.1 First-class functions............................................ 231 23.2 Anonymous functions........................................... 232 23.3 Recursion................................................... 233 23.4 map, filter, reduce, and list comprehensions........................ 234 23.5 The operator module......................................... 235 23.6 More about function arguments.................................... 235 24 The itertools and collections modules 237 24.1 Permutations and combinations.................................... 237 24.2 Cartesian product............................................. 238 24.3 Grouping things.............................................. 239 24.4 Miscellaneous things from itertools.............................. 240 24.5 Counting things............................................... 241 24.6 defaultdict............................................... 242 25 Exceptions 245 25.1 Basics...................................................... 245 25.2 Try/except/else........................................... 246 25.3 try/finally and with/as.................................... 247 25.4 More with exceptions........................................... 247 Bibliography 249 Index 249 Preface My goal here is for something that is partly a tutorial and partly a reference book. I like how tutorials get you up and running quickly, but they can often be a little wordy and disorganized. Reference books contain a lot of good information, but they are often too terse, and they don’t often give you a sense of what is important. My aim here is for something in the spirit of a tutorial but still useful as a reference. I summarize information in tables and give a lot of short example programs. I also like to jump right into things and fill in background information as I go, rather than covering the background material first. This book started out as about 30 pages of notes for students in my introductory programming class at Mount St. Mary’s University. Most of these students have no prior programming experience, and that has affected my approach. I leave out a lot of technical details and sometimes I oversimplify things. Some of these details are filled in later in the book, though other details are never filled in. But this book is not designed to cover everything, and I recommend reading other books and the Python documentation to fill in the gaps. The style of programming in this book is geared towards the kinds of programming things I like to do—short programs, often of a mathematical nature, small utilities to make my life easier, and small computer games. In fact, the things I cover in the book are the things that I have found most useful or interesting in my programming experience, and this book serves partly to document those things for myself. This book is not designed as a thorough preparation for a career in software engineering. Interested readers should progress from this book to a book that has more on computer science and the design and organization of large programs. In terms of structuring a course around this book or learning on your own, the basis is most of Part I. The first four chapters are critically important. Chapter 5 is useful, but not all of it is critical. Chapter 6 (strings) should be done before Chapter 7 (lists). Chapter 8 contains some more advanced list topics. Much of this can be skipped, though it is all interesting and useful. In particular, that chapter covers list comprehensions, which I use extensively later in the book. While you can get away without using list comprehensions, they provide an elegant and efficient way of doing things. Chapter 9 (while loops) is important. Chapter 10 contains a bunch of miscellaneous topics, all of which are useful, but many can be skipped if need be. The final four chapters of Part I are about dictionaries, text files, functions, and object-oriented programming. Part II is about graphics, mostly GUI programming with Tkinter. You can very quickly write some nice programs using Tkinter. For instance, Section 15.7 presents a 20-line working (though not ix x CONTENTS perfect) tic-tac-toe game. The final chapter of Part II covers a bit about the Python Imaging Library. Part III contains a lot of the fun and interesting things you can do with Python. If you are structur- ing a one-semester course around this book, you might want to pick a few topics in Part III to go over. This part of the book could also serve as a reference or as a place for interested and motivated students to learn more. All of the topics in this part of the book are things that I have found useful at one point or another. Though this book was designed to be used in an introductory programming course, it is also useful for those with prior programming experience looking to learn Python. If you are one of those people, you should be able to breeze through the first several chapters. You should find Part II to be a concise, but not superficial, treatment on GUI programming. Part III contains information on the features of Python that allow you to accomplish big things with surprisingly little code. In preparing this book the Python documentation at www.python.org was indispensable. This book was composed entirely in LATEX. There are a number of LATEXpackages, particularly listings and hyperref, that were particulary helpful. LATEXcode from http://blog.miliauskas.lt/ helped me get the listings package to nicely highlight the Python code. Listings for the longer programs are available at https://www.brianheinold.net/python/. Text files used in the text and exercises are available at https://www.brianheinold.net/python/textfiles.html I don’t have solutions available to the exercises here, but there is a separate set of a few hundred exercises and solutions at https://www.brianheinold.net/python/worked_exercises.html. Please send comments, corrections, and suggestions to [email protected]. Last updated March 3, 2024. Part I Basics 1 Chapter 1 Getting Started This chapter will get you up and running with Python, from downloading it to writing simple programs. 1.1 Installing Python Go to www.python.org and download the latest version of Python (version 3.5 as of this writing). It should be painless to install. If you have a Mac or Linux, you may already have Python on your computer, though it may be an older version. If it is version 2.7 or earlier, then you should install the latest version, as many of the programs in this book will not work correctly on older versions. 1.2 IDLE IDLE is a simple integrated development environment (IDE) that comes with Python. It’s a pro- gram that allows you to type in your programs and run them. There are other IDEs for Python, but for now I would suggest sticking with IDLE as it is simple to use. You can find IDLE in the Python 3.4 folder on your computer. When you first start IDLE, it starts up in the shell, which is an interactive window where you can type in Python code and see the output in the same window. I often use the shell in place of my calculator or to try out small pieces of code. But most of the time you will want to open up a new window and type the program in there. Note At least on Windows, if you click on a Python file on your desktop, your system will run the program, but not show the code, which is probably not what you want. Instead, if you right-click on the file, there should be an option called Edit with Idle. To edit an existing Python file, 3 4 CHAPTER 1. GETTING STARTED either do that or start up IDLE and open the file through the File menu. Keyboard shortcuts The following keystrokes work in IDLE and can really speed up your work. Keystroke Result CTRL+C Copy selected text CTRL+X Cut selected text CTRL+V Paste CTRL+Z Undo the last keystroke or group of keystrokes CTRL+SHIFT+Z Redo the last keystroke or group of keystrokes F5 Run module 1.3 A first program Start IDLE and open up a new window (choose New Window under the File Menu). Type in the following program. temp = eval(input( 'Enter a temperature in Celsius: ')) print( 'In Fahrenheit, that is ', 9/5*temp+32) Then, under the Run menu, choose Run Module (or press F5). IDLE will ask you to save the file, and you should do so. Be sure to append.py to the filename as IDLE will not automatically append it. This will tell IDLE to use colors to make your program easier to read. Once you’ve saved the program, it will run in the shell window. The program will ask you for a temperature. Type in 20 and press enter. The program’s output looks something like this: Enter a temperature in Celsius: 20 In Fahrenheit, that is 68.0 Let’s examine how the program does what it does. The first line asks the user to enter a tempera- ture. The input function’s job is to ask the user to type something in and to capture what the user types. The part in quotes is the prompt that the user sees. It is called a string and it will appear to the program’s user exactly as it appears in the code itself. The eval function is something we use here, but it won’t be clear exactly why until later. So for now, just remember that we use it when we’re getting numerical input. We need to give a name to the value that the user enters so that the program can remember it and use it in the second line. The name we use is temp and we use the equals sign to assign the user’s value to temp. The second line uses the print function to print out the conversion. The part in quotes is another string and will appear to your program’s user exactly as it appears in quotes here. The second 1.4. TYPING THINGS IN 5 argument to the print function is the calculation. Python will do the calculation and print out the numerical result. This program may seem too short and simple to be of much use, but there are many websites that have little utilities that do similar conversions, and their code is not much more complicated than the code here. A second program Here is a program that computes the average of two numbers that the user enters: num1 = eval(input( 'Enter the first number: ')) num2 = eval(input( 'Enter the second number: ')) print( 'The average of the numbers you entered is ', (num1+num2)/2) For this program we need to get two numbers from the user. There are ways to do that in one line, but for now we’ll keep things simple. We get the numbers one at a time and give each number its own name. The only other thing to note is the parentheses in the average calculation. This is because of the order of operations. All multiplications and divisions are performed before any additions and subtractions, so we have to use parentheses to get Python to do the addition first. 1.4 Typing things in Case Case matters. To Python, print, Print, and PRINT are all different things. For now, stick with lowercase as most Python statements are in lowercase. Spaces Spaces matter at the beginning of lines, but not elsewhere. For example, the code below will not work. temp = eval(input( 'Enter a temperature in Celsius: ')) print( 'In Fahrenheit, that is ', 9/5*temp+32) Python uses indentation of lines for things we’ll learn about soon. On the other hand, spaces in most other places don’t matter. For instance, the following lines have the same effect: print( 'Hello world! ') print ( 'Hello world! ') print( 'Hello world! ' ) Basically, computers will only do what you tell them, and they often take things very literally. Python itself totally relies on things like the placement of commas and parentheses so it knows what’s what. It is not very good at figuring out what you mean, so you have to be precise. It will be very frustrating at first, trying to get all of the parentheses and commas in the right places, but after a while it will become more natural. Still, even after you’ve programmed for a long time, you will still miss something. Fortunately, the Python interpreter is pretty good about helping you find your mistakes. 6 CHAPTER 1. GETTING STARTED 1.5 Getting input The input function is a simple way for your program to get information from people using your program. Here is an example: name = input( 'Enter your name: ') print( 'Hello, ', name) The basic structure is variable name = input(message to user) The above works for getting text from the user. To get numbers from the user to use in calculations, we need to do something extra. Here is an example: num = eval(input( 'Enter a number: ')) print( 'Your number squared: ', num*num) The eval function converts the text entered by the user into a number. One nice feature of this is you can enter expressions, like 3*12+5, and eval will compute them for you. Note If you run your program and nothing seems to be happening, try pressing enter. There is a bit of a glitch in IDLE that occasionally happens with input statements. 1.6 Printing Here is a simple example: print( 'Hi there ') The print function requires parenthesis around its arguments. In the program above, its only argument is the string 'Hi there'. Anything inside quotes will (with a few exceptions) be printed exactly as it appears. In the following, the first statement will output 3+4, while the second will output 7. print( '3+4 ') print(3+4) To print several things at once, separate them by commas. Python will automatically insert spaces between them. Below is an example and the output it produces. print( 'The value of 3+4 is ', 3+4) print( 'A ', 1, 'XYZ ', 2) The value of 3+4 is 7 A 1 XYZ 2 1.7. VARIABLES 7 Optional arguments There are two optional arguments to the print function. They are not overly important at this stage of the game, so you can safely skip over this section, but they are useful for making your output look nice. sep Python will insert a space between each of the arguments of the print function. There is an optional argument called sep, short for separator, that you can use to change that space to some- thing else. For example, using sep=':' would separate the arguments by a colon and sep='##' would separate the arguments by two pound signs. One particularly useful possibility is to have nothing inside the quotes, as in sep=''. This says to put no separation between the arguments. Here is an example where sep is useful for getting the output to look nice: print ( 'The value of 3+4 is ', 3+4, '. ') print ( 'The value of 3+4 is ', 3+4, '. ', sep= '') The value of 3+4 is 7. The value of 3+4 is 7. end The print function will automatically advance to the next line. For instance, the following will print on two lines: print( 'On the first line ') print( 'On the second line ') On the first line On the second line There is an optional argument called end that you can use to keep the print function from advanc- ing to the next line. Here is an example: print( 'On the first line ', end= '') print( 'On the second line ') On the first lineOn the second line Of course, this could be accomplished better with a single print, but we will see later that there are interesting uses for the end argument. 1.7 Variables Looking back at our first program, we see the use of a variable called temp: 8 CHAPTER 1. GETTING STARTED temp = eval(input( 'Enter a temperature in Celsius: ')) print( 'In Fahrenheit, that is ', 9/5*temp+32) One of the major purposes of a variable is to remember a value from one part of a program so that it can be used in another part of the program. In the case above, the variable temp stores the value that the user enters so that we can do a calculation with it in the next line. In the example below, we perform a calculation and need to use the result of the calculation in several places in the program. If we save the result of the calculation in a variable, then we only need to do the calculation once. This also helps to make the program more readable. temp = eval(input( 'Enter a temperature in Celsius: ')) f_temp = 9/5*temp+32 print( 'In Fahrenheit, that is ', f_temp) if f_temp > 212: print( 'That temperature is above the boiling point. ') if f_temp < 32: print( 'That temperature is below the freezing point. ') We haven’t discussed if statements yet, but they do exactly what you think they do. A second example Here is another example with variables. Before reading on, try to figure out what the values of x and y will be after the code is executed. x=3 y=4 z=x+y z=z+1 x=y y=5 After these four lines of code are executed, x is 4, y is 5 and z is 8. One way to understand something like this is to take it one line at a time. This is an especially useful technique for trying to understand more complicated chunks of code. Here is a description of what happens in the code above: 1. x starts with the value 3 and y starts with the value 4. 2. In line 3, a variable z is created to equal x+y, which is 7. 3. Then the value of z is changed to equal one more than it currently equals, changing it from 7 to 8. 4. Next, x is changed to the current value of y, which is 4. 5. Finally, y is changed to 5. Note that this does not affect x. 6. So at the end, x is 4, y is 5, and z is 8. 1.8. EXERCISES 9 Variable names There are just a couple of rules to follow when naming your variables. Variable names can contain letters, numbers, and the underscore. Variable names cannot contain spaces. Variable names cannot start with a number. Case matters—for instance, temp and Temp are different. It helps make your program more understandable if you choose names that are descriptive, but not so long that they clutter up your program. 1.8 Exercises 1. Print a box like the one below. ******************* ******************* ******************* ******************* 2. Print a box like the one below. ******************* * * * * ******************* 3. Print a triangle like the one below. * ** *** **** 512 − 282 4. Write a program that computes and prints the result of. It is roughly.1017. 47 · 48 + 5 5. Ask the user to enter a number. Print out the square of the number, but use the sep optional argument to print it out in a full sentence that ends in a period. Sample output is shown below. Enter a number: 5 The square of 5 is 25. 10 CHAPTER 1. GETTING STARTED 6. Ask the user to enter a number x. Use the sep optional argument to print out x , 2x , 3x , 4x , and 5x , each separated by three dashes, like below. Enter a number: 7 7---14---21---28---35 7. Write a program that asks the user for a weight in kilograms and converts it to pounds. There are 2.2 pounds in a kilogram. 8. Write a program that asks the user to enter three numbers (use three separate input state- ments). Create variables called total and average that hold the sum and average of the three numbers and print out the values of total and average. 9. A lot of cell phones have tip calculators. Write one. Ask the user for the price of the meal and the percent tip they want to leave. Then print both the tip amount and the total bill with the tip included. Chapter 2 For loops Probably the most powerful thing about computers is that they can repeat things over and over very quickly. There are several ways to repeat things in Python, the most common of which is the for loop. 2.1 Examples Example 1 The following program will print Hello ten times: for i in range(10): print( 'Hello ') The structure of a for loop is as follows: for variable name in range( number of times to repeat ): statements to be repeated The syntax is important here. The word for must be in lowercase, the first line must end with a colon, and the statements to be repeated must be indented. Indentation is used to tell Python which statements will be repeated. Example 2 The program below asks the user for a number and prints its square, then asks for another number and prints its square, etc. It does this three times and then prints that the loop is done. for i in range(3): num = eval(input( 'Enter a number: ')) print ( 'The square of your number is ', num*num) print( 'The loop is now done. ') 11 12 CHAPTER 2. FOR LOOPS Enter a number: 3 The square of your number is 9 Enter a number: 5 The square of your number is 25 Enter a number: 23 The square of your number is 529 The loop is now done. Since the second and third lines are indented, Python knows that these are the statements to be repeated. The fourth line is not indented, so it is not part of the loop and only gets executed once, after the loop has completed. Looking at the above example, we see where the term for loop comes from: we can picture the execution of the code as starting at the for statement, proceeding to the second and third lines, then looping back up to the for statement. Example 3 The program below will print A, then B, then it will alternate C’s and D’s five times and then finish with the letter E once. print( 'A ') print( 'B ') for i in range(5): print( 'C ') print( 'D ') print( 'E ') The first two print statements get executed once, printing an A followed by a B. Next, the C’s and D’s alternate five times. Note that we don’t get five C’s followed by five D’s. The way the loop works is we print a C, then a D, then loop back to the start of the loop and print a C and another D, etc. Once the program is done looping with the C’s and D’s, it prints one E. Example 4 If we wanted the above program to print five C’s followed by five D’s, instead of alternating C’s and D’s, we could do the following: print( 'A ') print( 'B ') for i in range(5): print( 'C ') for i in range(5): print( 'D ') print( 'E ') 2.2. THE LOOP VARIABLE 13 2.2 The loop variable There is one part of a for loop that is a little tricky, and that is the loop variable. In the example below, the loop variable is the variable i. The output of this program will be the numbers 0, 1,... , 99, each printed on its own line. for i in range(100): print(i) When the loop first starts, Python sets the variable i to 0. Each time we loop back up, Python increases the value of i by 1. The program loops 100 times, each time increasing the value of i by 1, until we have looped 100 times. At this point the value of i is 99. You may be wondering why i starts with 0 instead of 1. Well, there doesn’t seem to be any really good reason why other than that starting at 0 was useful in the early days of computing and it has stuck with us. In fact most things in computer programming start at 0 instead of 1. This does take some getting used to. Since the loop variable, i, gets increased by 1 each time through the loop, it can be used to keep track of where we are in the looping process. Consider the example below: for i in range(3): print(i+1, '-- Hello ') 1 -- Hello 2 -- Hello 3 -- Hello Names There’s nothing too special about the name i for our variable. The programs below will have the exact same result. for i in range(100): for wacky_name in range(100): print(i) print(wacky_name) It’s a convention in programming to use the letters i, j, and k for loop variables, unless there’s a good reason to give the variable a more descriptive name. 2.3 The range function The value we put in the range function determines how many times we will loop. The way range works is it produces a list of numbers from zero to the value minus one. For instance, range(5) produces five values: 0, 1, 2, 3, and 4. 14 CHAPTER 2. FOR LOOPS If we want the list of values to start at a value other than 0, we can do that by specifying the starting value. The statement range(1,5) will produce the list 1, 2, 3, 4. This brings up one quirk of the range function—it stops one short of where we think it should. If we wanted the list to contain the numbers 1 through 5 (including 5), then we would have to do range(1,6). Another thing we can do is to get the list of values to go up by more than one at a time. To do this, we can specify an optional step as the third argument. The statement range(1,10,2) will step through the list by twos, producing 1, 3, 5, 7, 9. To get the list of values to go backwards, we can use a step of -1. For instance, range(5,1,-1) will produce the values 5, 4, 3, 2, in that order. (Note that the range function stops one short of the ending value 1). Here are a few more examples: Statement Values generated range(10) 0,1,2,3,4,5,6,7,8,9 range(1,10) 1,2,3,4,5,6,7,8,9 range(3,7) 3,4,5,6 range(2,15,3) 2,5,8,11,14 range(9,2,-1) 9,8,7,6,5,4,3 Here is an example program that counts down from 5 and then prints a message. for i in range(5,0,-1): print(i, end= ' ') print( 'Blast off!! ') 5 4 3 2 1 Blast off!!! The end=' ' just keeps everything on the same line. 2.4 A Trickier Example Let’s look at a problem where we will make use of the loop variable. The program below prints a rectangle of stars that is 4 rows tall and 6 rows wide. for i in range(4): print( '* '*6) The rectangle produced by this code is shown below on the left. The code '*'*6 is something we’ll cover in Section 6.2; it just repeats the asterisk character six times. ****** * ****** ** ****** *** ****** **** 2.5. EXERCISES 15 Suppose we want to make a triangle instead. We can accomplish this with a very small change to the rectangle program. Looking at the program, we can see that the for loop will repeat the print statement four times, making the shape four rows tall. It’s the 6 that will need to change. The key is to change the 6 to i+1. Each time through the loop the program will now print i+1 stars instead of 6 stars. The loop counter variable i runs through the values 0, 1, 2, and 3. Using it allows us to vary the number of stars. Here is triangle program: for i in range(4): print( '* '*(i+1)) 2.5 Exercises 1. Write a program that prints your name 100 times. 2. Write a program to fill the screen horizontally and vertically with your name. [Hint: add the option end='' into the print function to fill the screen horizontally.] 3. Write a program that outputs 100 lines, numbered 1 to 100, each with your name on it. The output should look like the output below. 1 Your name 2 Your name 3 Your name 4 Your name... 100 Your name 4. Write a program that prints out a list of the integers from 1 to 20 and their squares. The output should look like this: 1 --- 1 2 --- 4 3 --- 9... 20 --- 400 5. Write a program that uses a for loop to print the numbers 8, 11, 14, 17, 20,... , 83, 86, 89. 6. Write a program that uses a for loop to print the numbers 100, 98, 96,... , 4, 2. 7. Write a program that uses exactly four for loops to print the sequence of letters below. AAAAAAAAAABBBBBBBCDCDCDCDEFFFFFFG 8. Write a program that asks the user for their name and how many times to print it. The pro- gram should print out the user’s name the specified number of times. 16 CHAPTER 2. FOR LOOPS 9. The Fibonacci numbers are the sequence below, where the first two numbers are 1, and each number thereafter is the sum of the two preceding numbers. Write a program that asks the user how many Fibonacci numbers to print and then prints that many. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... 10. Use a for loop to print a box like the one below. Allow the user to specify how wide and how high the box should be. [Hint: print('*'*10) prints ten asterisks.] ******************* ******************* ******************* ******************* 11. Use a for loop to print a box like the one below. Allow the user to specify how wide and how high the box should be. ******************* * * * * ******************* 12. Use a for loop to print a triangle like the one below. Allow the user to specify how high the triangle should be. * ** *** **** 13. Use a for loop to print an upside down triangle like the one below. Allow the user to specify how high the triangle should be. **** *** ** * 14. Use for loops to print a diamond like the one below. Allow the user to specify how high the diamond should be. * *** ***** ******* ***** *** * 2.5. EXERCISES 17 15. Write a program that prints a giant letter A like the one below. Allow the user to specify how large the letter should be. * * * ***** * * * * 18 CHAPTER 2. FOR LOOPS Chapter 3 Numbers This chapter focuses on numbers and simple mathematics in Python. 3.1 Integers and Decimal Numbers Because of the way computer chips are designed, integers and decimal numbers are represented differently on computers. Decimal numbers are represented by what are called floating point num- bers. The important thing to remember about them is you typically only get about 15 or so digits of precision. It would be nice if there were no limit to the precision, but calculations run a lot more quickly if you cut off the numbers at some point. On the other hand, integers in Python have no restrictions. They can be arbitrarily large. For decimal numbers, the last digit is sometimes slightly off due to the fact that computers work in binary (base 2) whereas our human number system is base 10. As an example, mathematically, we know that the decimal expansion of 7/3 is 2.333 · · · , with the threes repeating forever. But when we type 7/3 into the Python shell, we get 2.3333333333333335. This is called roundoff error. For most practical purposes this is not too big of a deal, but it actually can cause problems for some mathematical and scientific calculations. If you really need more precision, there are ways. See Section 22.5. 3.2 Math Operators Here is a list of the common operators in Python: 19 20 CHAPTER 3. NUMBERS Operator Description + addition - subtraction * multiplication / division ** exponentiation // integer division % modulo (remainder) Exponentiation Python uses ** for exponentiation. The caret, ^, is used for something else. Integer division The integer division operator, //, requires some explanation. Basically, for pos- itive numbers it behaves like ordinary division except that it throws away the decimal part of the result. For instance, while 8/5 is 1.6, we have 8//5 equal to 1. We will see uses for this operator later. Note that in many other programming languages and in older versions of Python, the usual division operator / actually does integer division on integers. Modulo The modulo operator, %, returns the remainder from a division. For instance, the result of 18%7 is 4 because 4 is the remainder when 18 is divided by 7. This operation is surprisingly useful. For instance, a number is divisible by n precisely when it leaves a remainder of 0 when divided by n. Thus to check if a number, n, is even, see if n%2 is equal to 0. To check if n is divisible by 3, see if n%3 is 0. One use of this is if you want to schedule something in a loop to happen only every other time through the loop, you could check to see if the loop variable modulo 2 is equal to 0, and if it is, then do that something. The modulo operator shows up surprisingly often in formulas. If you need to “wrap around” and come back to the start, the modulo is useful. For example, think of a clock. If you go six hours past 8 o’clock, the result is 2 o’clock. Mathematically, this can be accomplished by doing a modulo by 12. That is, (8+6)%12 is equal to 2. As another example, take a game with players 1 through 5. Say you have a variable player that keeps track of the current player. After player 5 goes, it’s player 1’s turn again. The modulo operator can be used to take care of this: player = player%5+1 When player is 5, player%5 will be 0 and expression will set player to 1. 3.3. ORDER OF OPERATIONS 21 3.3 Order of operations Exponentiation gets done first, followed by multiplication and division (including // and %), and addition and subtraction come last. The classic math class mnemonic, PEMDAS (Please Excuse My Dear Aunt Sally), might be helpful. This comes into play in calculating an average. Say you have three variables x, y, and z, and you want to calculate the average of their values. To expression x+y+z/3 would not work. Because x+ y+z division comes before addition, you would actually be calculating x + y + 3z instead of 3. This is easily fixed by using parentheses: (x+y+z)/3. In general, if you’re not sure about something, adding parentheses might help and usually doesn’t do any harm. 3.4 Random numbers To make an interesting computer game, it’s good to introduce some randomness into it. Python comes with a module, called random, that allows us to use random numbers in our programs. Before we get to random numbers, we should first explain what a module is. The core part of the Python language consists of things like for loops, if statements, math operators, and some functions, like print and input. Everything else is contained in modules, and if we want to use something from a module we have to first import it—that is, tell Python that we want to use it. At this point, there is only one function, called randint, that we will need from the random mod- ule. To load this function, we use the following statement: from random import randint Using randint is simple: randint(a,b) will return a random integer between a and b including both a and b. (Note that randint includes the right endpoint b unlike the range function). Here is a short example: from random import randint x = randint(1,10) print( 'A random number between 1 and 10: ', x) A random number between 1 and 10: 7 The random number will be different every time we run the program. 3.5 Math functions The math module Python has a module called math that contains familiar math functions, in- cluding sin, cos, tan, exp, log, log10, factorial, sqrt, floor, and ceil. There are also the inverse trig functions, hyperbolic functions, and the constants pi and e. Here is a short example: 22 CHAPTER 3. NUMBERS from math import sin, pi print( 'Pi is roughly ', pi) print( 'sin(0) = ', sin(0)) Pi is roughly 3.14159265359 sin(0) = 0.0 Built-in math functions There are two built in math functions, abs (absolute value) and round that are available without importing the math module. Here are some examples: print(abs(-4.3)) print(round(3.336, 2)) print(round(345.2, -1)) 4.3 3.34 350.0 The round function takes two arguments: the first is the number to be rounded and the second is the number of decimal places to round to. The second argument can be negative. 3.6 Getting help from Python There is documentation built into Python. To get help on the math module, for example, go to the Python shell and type the following two lines: >>> import math >>> dir(math) ['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'] This gives a list of all the functions and variables in the math module. You can ignore all of the ones that start with underscores. To get help on a specific function, say the floor function, you can type help(math.floor). Typing help(math) will give you help for everything in the math module. 3.7 Using the Shell as a Calculator The Python shell can be used as a very handy and powerful calculator. Here is an example session: 3.8. EXERCISES 23 >>> 23**2 529 >>> s = 0 >>> for n in range(1,10001): s = s + 1/n**2 >>> s 1.6448340718480652 >>> from math import * >>> factorial(10) 3628800 The second example here sums the numbers 1 + 1/4 + 1/9 + · · · + 1/100002. The result is stored in the variable s. To inspect the value of that variable, just type its name and press enter. Inspecting variables is useful for debugging your programs. If a program is not working properly, you can type your variable names into the shell after the program has finished to see what their values are. The statement from math import* imports every function from the math module, which can make the shell a lot like a scientific calculator. Note Under the Shell menu, select Restart shell if you want to clear the values of all the variables. 3.8 Exercises 1. Write a program that generates and prints 50 random integers, each between 3 and 6. 2. Write a program that generates a random number, x , between 1 and 50, a random number y between 2 and 5, and computes x y. 3. Write a program that generates a random number between 1 and 10 and prints your name that many times. 4. Write a program that generates a random decimal number between 1 and 10 with two decimal places of accuracy. Examples are 1.23, 3.45, 9.80, and 5.00. 5. Write a program that generates 50 random numbers such that the first number is between 1 and 2, the second is between 1 and 3, the third is between 1 and 4,... , and the last is between 1 and 51. |x− y| 6. Write a program that asks the user to enter two numbers, x and y , and computes x+ y. 7. Write a program that asks the user to enter an angle between −180◦ and 180◦. Using an expression with the modulo operator, convert the angle to its equivalent between 0◦ and 360◦. 24 CHAPTER 3. NUMBERS 8. Write a program that asks the user for a number of seconds and prints out how many minutes and seconds that is. For instance, 200 seconds is 3 minutes and 20 seconds. [Hint: Use the // operator to get minutes and the % operator to get seconds.] 9. Write a program that asks the user for an hour between 1 and 12 and for how many hours in the future they want to go. Print out what the hour will be that many hours into the future. An example is shown below. Enter hour: 8 How many hours ahead? 5 New hour: 1 o'clock 10. (a) One way to find out the last digit of a number is to mod the number by 10. Write a program that asks the user to enter a power. Then find the last digit of 2 raised to that power. (b) One way to find out the last two digits of a number is to mod the number by 100. Write a program that asks the user to enter a power. Then find the last two digits of 2 raised to that power. (c) Write a program that asks the user to enter a power and how many digits they want. Find the last that many digits of 2 raised to the power the user entered. 11. Write a program that asks the user to enter a weight in kilograms. The program should convert it to pounds, printing the answer rounded to the nearest tenth of a pound. 12. Write a program that asks the user for a number and prints out the factorial of that number. 13. Write a program that asks the user for a number and then prints out the sine, cosine, and tangent of that number. 14. Write a program that asks the user to enter an angle in degrees and prints out the sine of that angle. 15. Write a program that prints out the sine and cosine of the angles ranging from 0 to 345◦ in 15◦ increments. Each result should be rounded to 4 decimal places. Sample output is shown below: 0 --- 0.0 1.0 15 --- 0.2588 0.9659 30 --- 0.5 0.866... 345 --- -0.2588 0.9659 16. Below is described how to find the date of Easter in any year. Despite its intimidating appear- ance, this is not a hard problem. Note that ⌊x⌋ is the floor function, which for positive numbers just drops the decimal part of the number. For instance ⌊3.14⌋ = 3. The floor function is part of the math module. C = century (1900’s → C = 19) 3.8. EXERCISES 25 Y = year (all four digits) m = (15 + C − ⌊ C4 ⌋ − ⌊ 8C+13 25 ⌋) mod 30 n = (4 + C − ⌊ C4 ⌋) mod 7 a = Y mod 4 b = Y mod 7 c = Y mod 19 d = (19c + m) mod 30 e = (2a + 4b + 6d + n) mod 7 Easter is either March (22 + d + e) or April (d + e − 9). There is an exception if d = 29 and e = 6. In this case, Easter falls one week earlier on April 19. There is another exception if d = 28, e = 6, and m = 2, 5, 10, 13, 16, 21, 24, or 39. In this case, Easter falls one week earlier on April 18. Write a program that asks the user to enter a year and prints out the date of Easter in that year. (See Tattersall, Elementary Number Theory in Nine Chapters, 2nd ed., page 167) 17. A year is a leap year if it is divisible by 4, except that years divisible by 100 are not leap years unless they are also divisible by 400. Ask the user to enter a year, and, using the // operator, determine how many leap years there have been between 1600 and that year. 18. Write a program that given an amount of change less than $1.00 will print out exactly how many quarters, dimes, nickels, and pennies will be needed to efficiently make that change. [Hint: the // operator may be useful.] 19. Write a program that draws “modular rectangles” like the ones below. The user specifies the width and height of the rectangle, and the entries start at 0 and increase typewriter fashion from left to right and top to bottom, but are all done mod 10. Below are examples of a 3 × 5 rectangle and a 4 × 8. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 26 CHAPTER 3. NUMBERS Chapter 4 If statements Quite often in programs we only want to do something provided something else is true. Python’s if statement is what we need. 4.1 A Simple Example Let’s try a guess-a-number program. The computer picks a random number, the player tries to guess, and the program tells them if they are correct. To see if the player’s guess is correct, we need something new, called an if statement. from random import randint num = randint(1,10) guess = eval(input( 'Enter your guess: ')) if guess==num: print( 'You got it! ') The syntax of the if statement is a lot like the for statement in that there is a colon at the end of the if condition and the following line or lines are indented. The lines that are indented will be executed only if the condition is true. Once the indentation is done with, the if block is concluded. The guess-a-number game works, but it is pretty simple. If the player guesses wrong, nothing happens. We can add to the if statement as follows: if guess==num: print( 'You got it! ') else: print( 'Sorry. The number is ', num) We have added an else statement, which is like an “otherwise.” 27 28 CHAPTER 4. IF STATEMENTS 4.2 Conditional operators The comparison operators are ==, >, =, 3: if x is greater than 3 if x>=3: if x is greater than or equal to 3 if x==3: if x is 3 if x!=3: if x is not 3 There are three additional operators used to construct more complicated conditions: and, or, and not. Here are some examples: if grade>=80 and grade1000 or time>20: print( 'Game over. ') if not (score>1000 or time>20): print( 'Game continues. ') Order of operations In terms of order of operations, and is done before or, so if you have a complicated condition that contains both, you may need parentheses around the or condition. Think of and as being like multiplication and or as being like addition. Here is an example: if (score20) and turns_remaining==0: print( 'Game over. ') 4.3 Common Mistakes Mistake 1 The operator for equality consists of two equals signs. It is a really common error to forget one of the equals signs. Incorrect Correct if x=1: if x==1: Mistake 2 A common mistake is to use and where or is needed or vice-versa. Consider the following if statements: if x>1 and x1 or x=80 and =80 and grade=70: print( 'C ') 30 CHAPTER 4. IF STATEMENTS elif grade>=60: print( 'D ') else: print( 'F ') With the separate if statements, each condition is checked regardless of whether it really needs to be. That is, if the score is a 95, the first program will print an A but then continue on and check to see if the score is a B, C, etc., which is a bit of a waste. Using elif, as soon as we find where the score matches, we stop checking conditions and skip all the way to the end of the whole block of statements. An added benefit of this is that the conditions we use in the elif statements are simpler than in their if counterparts. For instance, when using elif, the second part of the second if statement condition, grade10: count=count+1 print( 'There are ', count, 'numbers greater than 10. ') Think of the count variable as if we are keeping a tally on a piece of paper. Every time we get a number larger than 10, we add 1 to our tally. In the program, this is accomplished by the line count=count+1. The first line of the program, count=0, is important. Without it, the Python interpreter would get to the count=count+1 line and spit out an error saying something about not knowing what count is. This is because the first time the program gets to this line, it tries to do what it says: take the old value of count, add 1 to it, and store the result in count. But the first time the program gets there, there is no old value of count to use, so the Python interpreter doesn’t know what to do. To avoid the error, we need to define count, and that is what the first 33 34 CHAPTER 5. MISCELLANEOUS TOPICS I line does. We set it to 0 to indicate that at the start of the program no numbers greater than 10 have been found. Counting is an extremely common thing. The two things involved are: 1. count=0 — Start the count at 0. 2. count=count+1 — Increase the count by 1. Example 2 This modification of the previous example counts how many of the numbers the user enters are greater than 10 and also how many are equal to 0. To count two things we use two count variables. count1 = 0 count2 = 0 for i in range(10): num = eval(input( 'Enter a number: ')) if num>10: count1=count1+1 if num==0: count2=count2+1 print( 'There are ', count1, 'numbers greater than 10. ') print( 'There are ', count2, 'zeroes. ') Example 3 Next we have a slightly trickier example. This program counts how many of the squares from 12 to 1002 end in a 4. count = 0 for i in range(1,101): if (i**2)%10==4: count = count + 1 print(count) A few notes here: First, because of the aforementioned quirk of the range function, we need to use range(1,101) to loop through the numbers 1 through 100. The looping variable i takes on those values, so the squares from 12 to 1002 are represented by i**2. Next, to check if a number ends in 4, a nice mathematical trick is to check if it leaves a remainder of 4 when divided by 10. The modulo operator, %, is used to get the remainder. 5.2 Summing Closely related to counting is summing, where we want to add up a bunch of numbers. 5.3. SWAPPING 35 Example 1 This program will add up the numbers from 1 to 100. The way this works is that each time we encounter a new number, we add it to our running total, s. s = 0 for i in range(1,101): s = s + i print( 'The sum is ', s) Example 2 This program that will ask the user for 10 numbers and then computes their average. s = 0 for i in range(10): num = eval(input( 'Enter a number: ')) s = s + num print( 'The average is ', s/10) Example 3 A common use for summing is keeping score in a game. Near the beginning of the game we would set the score variable equal to 0. Then when we want to add to the score we would do something like below: score = score + 10 5.3 Swapping Quite often we will want to swap the values of two variables, x and y. It would be tempting to try the following: x = y y = x But this will not work. Suppose x is 3 and y is 5. The first line will set x to 5, which is good, but then the second line will set y to 5 also because x is now 5. The trick is to use a third variable to save the value of x: hold = x x = y y = hold In many programming languages, this is the usual way to swap variables. Python, however, pro- vides a nice shortcut: x,y = y,x We will learn later exactly why this works. For now, feel free to use whichever method you prefer. The latter method, however, has the advantage of being shorter and easier to understand. 36 CHAPTER 5. MISCELLANEOUS TOPICS I 5.4 Flag variables A flag variable can be used to let one part of your program know when something happens in another part of the program. Here is an example that determines if a number is prime. num = eval(input( 'Enter number: ')) flag = 0 for i in range(2,num): if num%i==0: flag = 1 if flag==1: print( 'Not prime ') else: print( 'Prime ') Recall that a number is prime if it has no divisors other than 1 and itself. The way the program above works is flag starts off at 0. We then loop from 2 to num-1. If one of those values turns out to be a divisor, then flag gets set to 1. Once the loop is finished, we check to see if the flag got set or not. If it did, we know there was a divisor, and num isn’t prime. Otherwise, the number must be prime. 5.5 Maxes and mins A common programming task is to find the largest or smallest value in a series of values. Here is an example where we ask the user to enter ten positive numbers and then we print the largest one. largest = eval(input( 'Enter a positive number: ')) for i in range(9): num = eval(input( 'Enter a positive number: ')) if num>largest: largest=num print( 'Largest number: ', largest) The key here is the variable largest that keeps track of the largest number found so far. We start by setting it equal to the user’s first number. Then, every time we get a new number from the user, we check to see if the user’s number is larger than the current largest value (which is stored in largest). If it is, then we set largest equal to the user’s number. If, instead, we want the smallest value, the only change necessary is that > becomes 50: count=count+1 Example 4 Given a list L that contains numbers between 1 and 100, create a new list whose first element is how many ones are in L, whose second element is how many twos are in L, etc. frequencies = [] for i in range(1,101): frequences.append(L.count(i)) The key is the list method count that tells how many times a something occurs in a list. Example 5 Write a program that prints out the two largest and two smallest elements of a list called scores. scores.sort() print( 'Two smallest: ', scores, scores) print( 'Two largest: ', scores[-1], scores[-2]) Once we sort the list, the smallest values are at the beginning and the largest are at the end. Example 6 Here is a program to play a simple quiz game. num_right = 0 # Question 1 print( 'What is the capital of France? ', end= ' ') guess = input() if guess.lower()== 'paris ': print( 'Correct! ') num_right+=1 else: print( 'Wrong. The answer is Paris. ') print( 'You have ', num_right, 'out of 1 right ') #Question 2 print( 'Which state has only one neighbor? ', end= ' ') guess = input() if guess.lower()== 'maine ': print( 'Correct! ') num_right+=1 else: print( 'Wrong. The answer is Maine. ') print( 'You have ', num_right, 'out of 2 right, ') 62 CHAPTER 7. LISTS The code works, but it is very tedious. If we want to add more questions, we have to copy and paste one of these blocks of code and then change a bunch of things. If we decide to change one of the questions or the order of the questions, then there is a fair amount of rewriting involved. If we decide to change the design of the game, like not telling the user the correct answer, then every single block of code has to be rewritten. Tedious code like this can often be greatly simplified with lists and loops: questions = [ 'What is the capital of France? ', 'Which state has only one neighbor? '] answers = [ 'Paris ', 'Maine '] num_right = 0 for i in range(len(questions)): guess = input(questions[i]) if guess.lower()==answers[i].lower(): print( 'Correct ') num_right=num_right+1 else: print( 'Wrong. The answer is ', answers[i]) print( 'You have ', num_right, 'out of ', i+1, 'right. ') If you look carefully at this code, you will see that the code in the loop is the nearly the same as the code of one of the blocks in the previous program, except that in the statements where we print the questions and answers, we use questions[i] and answers[i] in place of the actual text of the questions themselves. This illustrates the general technique: If you find yourself repeating the same code over and over, try lists and a for loop. The few parts of your repetitious code that are varying are where the list code will go. The benefits of this are that to change a question, add a question, or change the order, only the questions and answers lists need to be changed. Also, if you want to make a change to the program, like not telling the user the correct answer, then all you have to do is modify a single line, instead of twenty copies of that line spread throughout the program. 7.7 Exercises 1. Write a program that asks the user to enter a list of integers. Do the following: (a) Print the total number of items in the list. (b) Print the last item in the list. (c) Print the list in reverse order. (d) Print Yes if the list contains a 5 and No otherwise. (e) Print the number of fives in the list. (f) Remove the first and last items from the list, sort the remaining items, and print the result. 7.7. EXERCISES 63 (g) Print how many integers in the list are less than 5. 2. Write a program that generates a list of 20 random numbers between 1 and 100. (a) Print the list. (b) Print the average of the elements in the list. (c) Print the largest and smallest values in the list. (d) Print the second largest and second smallest entries in the list (e) Print how many even numbers are in the list. 3. Start with the list [8,9,10]. Do the following: (a) Set the second entry (index 1) to 17 (b) Add 4, 5, and 6 to the end of the list (c) Remove the first entry from the list (d) Sort the list (e) Double the list (f) Insert 25 at index 3 The final list should equal [4,5,6,25,10,17,4,5,6,10,17] 4. Ask the user to enter a list containing numbers between 1 and 12. Then replace all of the entries in the list that are greater than 10 with 10. 5. Ask the user to enter a list of strings. Create a new list that consists of those strings with their first characters removed. 6. Create the following lists using a for loop. (a) A list consisting of the integers 0 through 49 (b) A list containing the squares of the integers 1 through 50. (c) The list ['a','bb','ccc','dddd',... ] that ends with 26 copies of the letter z. 7. Write a program that takes any two lists L and M of the same size and adds their elements together to form a new list N whose elements are sums of the corresponding elements in L and M. For instance, if L=[3,1,4] and M=[1,5,9], then N should equal [4,6,13]. 8. Write a program that asks the user for an integer and creates a list that consists of the factors of that integer. 9. When playing games where you have to roll two dice, it is nice to know the odds of each roll. For instance, the odds of rolling a 12 are about 3%, and the odds of rolling a 7 are about 17%. You can compute these mathematically, but if you don’t know the math, you can write a program to do it. To do this, your program should simulate rolling two dice about 10,000 times and compute and print out the percentage of rolls that come out to be 2, 3, 4,... , 12. 64 CHAPTER 7. LISTS 10. Write a program that rotates the elements of a list so that the element at the first index moves to the second index, the element in the second index moves to the third index, etc., and the element in the last index moves to the first index. 11. Using a for loop, create the list below, which consists of ones separated by increasingly many zeroes. The last two ones in the list should be separated by ten zeroes. [1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,....] 12. Write a program that generates 100 random integers that are either 0 or 1. Then find the longest run of zeros, the largest number of zeros in a row. For instance, the longest run of zeros in [1,0,1,1,0,0,0,0,1,0,0] is 4. 13. Write a program that removes any repeated items from a list so that each item appears at most once. For instance, the list [1,1,2,3,4,3,0,0] would become [1,2,3,4,0]. 14. Write a program that asks the user to enter a length in feet. The program should then give the user the option to convert from feet into inches, yards, miles, millimeters, centimeters, meters, or kilometers. Say if the user enters a 1, then the program converts to inches, if they enter a 2, then the program converts to yards, etc. While this can be done with if statements, it is much shorter with lists and it is also easier to add new conversions if you use lists. 15. There is a provably unbreakable cipher called a one-time pad. The way it works is you shift each character of the message by a random amount between 1 and 26 characters, wrapping around the alphabet if necessary. For instance, if the current character is y and the shift is 5, then the new character is d. Each character gets its own shift, so there needs to be as many random shifts as there are characters in the message. As an example, suppose the user enters secret. The program should generate a random shift between 1 and 26 for each character. Suppose the randomly generated shifts are 1, 3, 2, 10, 8, and 2. The encrypted message would be thebmv. (a) Write a program that asks the user for a message and encrypts the message using the one-time pad. First convert the string to lowercase. Any spaces and punctuation in the string should be left unchanged. For example, Secret!!! becomes thebmv!!! using the shifts above. (b) Write a program to decrypt a string encrypted as above. The reason it is called a one-time-pad is that the list of random shifts should only be used once. It becomes easily breakable if the same random shifts are used for more than one message. Moreover, it is only provably unbreakable if the random numbers are truly random, and the numbers generated by randint are not truly random. For this problem, just use randint, but for cryptographically safe random numbers, see Section 22.8. Chapter 8 More with Lists 8.1 Lists and the random module There are some nice functions in the random module that work on lists. Function Description choice(L) picks a random item from L sample(L,n) picks a group of n random items from L shuffle(L) Shuffles the items of L Note The shuffle function modifies the original list, so if you don’t want your list changed, you’ll need to make a copy of it. Example 1 We can use choice to pick a name from a list of names. from random import choice names = [ 'Joe ', 'Bob ', 'Sue ', 'Sally '] current_player = choice(names) Example 2 The sample function is similar to choice. Whereas choice picks one item from a list, sample can be used to pick several. from random import sample names = [ 'Joe ', 'Bob ', 'Sue ', 'Sally '] team = sample(names, 2) 65 66 CHAPTER 8. MORE WITH LISTS Example 3 The choice function also works with strings, picking a random character from a string. Here is an example that uses choice to fill the screen with a bunch of random characters. from random import choice s= 'abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*() ' for i in range(10000): print(choice(s), end= '') Example 4 Here is a nice use of shuffle to pick a random ordering of players in a game. from random import shuffle players = [ 'Joe ', 'Bob ', 'Sue ', 'Sally '] shuffle(players) for p in players: print(p, 'it is your turn. ') # code to play the game goes here... Example 5 Here we use shuffle divide a group of people into teams of two. Assume we are given a list called names. shuffle(names) teams = [] for i in range(0,len(names),2): teams.append([names[i], names[i+1]]) Each item in teams is a list of two names. The way the code works is we shuffle the names so they are in a random order. The first two names in the shuffled list become the first team, the next two names become the second team, etc. Notice that we use the optional third argument to range to skip ahead by two through the list of names. 8.2 split The split method returns a list of the words of a string. The method assumes that words are sep- arated by whitespace, which can be either spaces, tabs or newline characters. Here is an example: s = 'Hi! This is a test. ' print(s.split()) ['Hi!', 'This', 'is', 'a', 'test.'] As we can see, since split breaks up the string at spaces, the punctuation will be part of the words. There is a module called string that contains, among other things, a string variable called punctuation that contains common punctuation. We can remove the punctuation from a string s with the following code: 8.3. JOIN 67 from string import punctuation for c in punctuation: s = s.replace(c, '') Example Here is a program that counts how many times a certain word occurs in a string. from string import punctuation s = input( 'Enter a string: ') for c in punctuation: s = s.replace(c, '') s = s.lower() L = s.split() word = input( 'Enter a word: ') print(word, 'appears ', L.count(word), 'times. ') Optional argument The split method takes an optional argument that allows it to break the string at places other than spaces. Here is an example: s = '1-800-271-8281 ' print(s.split( '- ')) ['1', '800', '271', '8281'] 8.3 join The join method is in some sense the opposite of split. It is a string method that takes a list of strings and joins them together into a single string. Here are some examples, using the list L = ['A','B','C'] Operation Result ' '.join(L) A B C ''.join(L) ABC ', '.join(L) A, B, C '***'.join(L) A***B***C Example Write a program that creates an anagram of a given word. An anagram of a word uses the same letters as the word but in a different order. For instance, two anagrams of the word there are three and ether. Don’t worry about whether the anagram is a real word or not. 68 CHAPTER 8. MORE WITH LISTS This sounds like something we could use shuffle for, but shuffle only works with lists. What we need to do is convert our string into a list, use shuffle on it, and then convert the list back into a string. To turn a string s into a list, we can use list(s). (See Section 10.1.) To turn the list back into a string, we will use join. from random import shuffle word = input( 'Enter a word: ') letter_list = list(word) shuffle(letter_list) anagram = ''.join(letter_list) print(anagram) 8.4 List comprehensions List comprehensions are a powerful way to create lists. Here is a simple example: L = [i for i in range(5)] This creates the list [0,1,2,3,4]. Notice that the syntax of a list comprehension is somewhat rem- iniscent of set notation in mathematics. Here are a couple more examples of list comprehensions. For these examples, assume the following: string = 'Hello ' L = [1,14,5,9,12] M = [ 'one ', 'two ', 'three ', 'four ', 'five ', 'six '] List comprehension Resulting list [0 for i in range(10)] [0,0,0,0,0,0,0,0,0,0] [i**2 for i in range(1,8)] [1,4,9,16,25,36,49] [i*10 for i in L] [10,140,50,90,120] [c*2 for c in string] ['HH','ee','ll','ll','oo'] [m for m in M] ['o','t','t','f','f','s'] [i for i in L if i50]) Example 4 Given a list L that contains numbers between 1 and 100, create a new list whose first element is how many ones are in L, whose second element is how many twos are in L, etc. frequencies = [L.count(i) for i in range(1,101)] Another example The join method can often be used with list comprehensions to quickly build up a string. Here we create a string that contains a random assortment of 1000 letters. from random import choice alphabet = 'abcdefghijklmnopqrstuvwxyz ' s = ''.join([choice(alphabet) for i in range(1000)]) 70 CHAPTER 8. MORE WITH LISTS One more example Suppose we have a list whose elements are lists of size 2, like below: L = [[1,2], [3,4], [5,6]] If we want to flip the order of the entries in the lists, we can use the following list comprehension: M = [[y,x] for x,y in L] [[2, 1], [4, 3], [6, 5]] Note You can certainly get away without using list comprehensions, but once you get the hang of them, you’ll find they are both quicker to write and easier to read than the longer ways of creating lists. 8.6 Two-dimensional lists There are a number of common things that can be represented by two-dimensional lists, like a Tic- tac-toe board or the pixels on a computer screen. In Python, one way to create a two-dimensional list is to create a list whose items are themselves lists. Here is an example: L = [[1,2,3], [4,5,6], [7,8,9]] Indexing We use two indices to access individual items. To get the entry in row r, column c, use the following: L[r][c] Printing a two-dimensional list To print a two-dimensional list, you can use nested for loops. The following example prints a 10 × 5 list: for r in range(10): for c in range(5): print(L[r][c], end=" ") print() Another option is to use the pprint function of the pprint module. This function is used to “pretty-print” its argument. Here is an example to print a list L: from pprint import pprint pprint(L) The pprint function can be used to nicely print ordinary lists and other objects in Python. Working with two-dimensional lists Nested for loops, like the ones used in printing a two- dimensional list, can also be used to process the items in a two-dimensional list. Here is an example that counts how many entries in a 10 × 5 list are even. 8.6. TWO-DIMENSIONAL LISTS 71 count = 0 for r in range(10): for c in range(5): if L[r][c]%2==0: count = count + 1 This can also be done with a list comprehension: count = sum([1 for r in range(10) for c in range(5) if L[r][c]%2==0]) Creating large two-dimensional lists To create a larger list, you can use a list comprehension like below: L = [*50 for i in range(100)] This creates a list of zeroes with 100 rows and 50 columns. Picking out rows and columns To get the row r of L (starting at row r = 0), use the following: L[r] To get the column c of L (starting at column c = 0), use a list comprehension: [L[i][c] for i in range(len(L))] Flattening a list To flatten a two-dimensional list, that is, return a one-dimensional list of its elements, use the following: [j for row in L for j in row] For instance, suppose we have the following list: L = [[1,2,3], [4,5,6], [7,8,9]] The flattened list will be: [1, 2, 3, 4, 5, 6, 7, 8, 9] Higher dimensions Creating and using 3-dimensional and higher lists is similar. Here we create a 5 × 5 × 5 list: L = [[*5 for i in range(5)] for j in range(5)] It is a list whose items are lists of lists. The first entry in the list is L 72 CHAPTER 8. MORE WITH LISTS 8.7 Exercises 1. Write a program that asks the user to enter some text and then counts how many articles are in the text. Articles are the words 'a', 'an', and 'the'. 2. Write a program that allows the user to enter five numbers (read as strings). Create a string that consists of the user’s numbers separated by plus signs. For instance, if the user enters 2, 5, 11, 33, and 55, then the string should be '2+5+11+33+55'. 3. (a) Ask the user to enter a sentence and print out the third word of the sentence. (b) Ask the user to enter a sentence and print out every third word of the sentence. 4. (a) Write a program that asks the user to enter a sentence and then randomly rearranges the words of the sentence. Don’t worry about getting punctuation or capitalization correct. (b) Do the above problem, but now make sure that the sentence starts with a capital, that the original first word is not capitalized if it comes in the middle of the sentence, and that the period is in the right place. 5. Write a simple quote-of-the-day program. The program should contain a list of quotes, and when the user runs the program, a randomly selected quote should be printed. 6. Write a simple lottery drawing program. The lottery drawing should consist of six different numbers between 1 and 48. 7. Write a program that estimates the average number of drawings it takes before the user’s numbers are picked in a lottery that consists of correctly picking six different numbers that are between 1 and 10. To do this, run a loop 1000 times that randomly generates a set of user numbers and simulates drawings until the user’s numbers are drawn. Find the average number of drawings needed over the 1000 times the loop runs. 8. Write a program that simulates drawing names out of a hat. In this drawing, the number of hat entries each person gets may vary. Allow the user to input a list of names and a list of how many entries each person has in the drawing, and print out who wins the drawing. 9. Write a simple quiz game that has a list of ten questions and a list of answers to those ques- tions. The game should give the player four randomly selected questions to answer. It should ask the questions one-by-one, and tell the player whether they got the question right or wrong. At the end it should print out how many out of four they got right. 10. Write a censoring program. Allow the user to enter some text and your program should print out the text with all the curse words starred out. The number of stars should match the length of the curse word. For the purposes of this program, just use the“curse” words darn, dang, freakin, heck, and shoot. Sample output is below: Enter some text: Oh shoot, I thought I had the dang problem figured out. Darn it. Oh well, it was a heck of a freakin try. Oh *****, I thought I had the **** problem figured out. **** it. Oh well, it was a **** of a ****** try. 8.7. EXERCISES 73 11. Section 8.3 described how to use the shuffle method to create a random anagram of a string. Use the choice method to create a random anagram of a string. 12. Write a program that gets a string from the user containing a potential telephone number. The program should print Valid if it decides the phone number is a real phone number, and Invalid otherwise. A phone number is considered valid as long as it is written in the form abc-def-hijk or 1-abc-def-hijk. The dashes must be included, the phone number should contain only numbers and dashes, and the number of digits in each group must be correct. Test your program with the output shown below. Enter a phone number: 1-301-447-5820 Valid Enter a phone number: 301-447-5820 Valid Enter a phone number: 301-4477-5820 Invalid Enter a phone number: 3X1-447-5820 Invalid Enter a phone number: 3014475820 Invalid 13. Let L be a list of strings. Write list comprehensions that create new lists from L for each of the following. (a) A list that consists of the strings of s with their first characters removed (b) A li

Use Quizgecko on...
Browser
Browser