Create Presentation
Download Presentation

Download Presentation
## Python Programming: An Introduction to Computer Science

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**Python Programming:An Introduction toComputer Science**Chapter 3 Computing with Numbers Python Programming, 2/e**Objectives**• To understand the concept of data types. • To be familiar with the basic numeric data types in Python. • To understand the fundamental principles of how numbers are represented in a computer. Python Programming, 2/e**Objectives (cont.)**• To be able to use the Python math library. • To understand the accumulator program pattern. • To be able to write programs that process numerical data. Python Programming, 2/e**Numeric Data Types**• The information that is stored and manipulated by programs is referred to as data. • There are two different kinds of numbers! • 5, 4, 3, 6 are whole numbers – they don’t have a fractional part • 5.25, .10, 3.05, .01 are decimal fractions Python Programming, 2/e**Numeric Data Types**• Inside the computer, whole numbers and decimal fractions are represented quite differently! • We say that decimal fractions and whole numbers are two different data types. • The data type of an object determines what values it can have and what operations can be performed on it. Python Programming, 2/e**Numeric Data Types**• Whole numbers are represented using the integer (int for short) data type. • These values can be positive or negative whole numbers or zero. Python Programming, 2/e**Numeric Data Types**• Numbers that can have fractional parts are represented as floating point (or float) values. • How can we tell which is which? • A numeric literal without a decimal point is an int value • A literal that has a decimal point is represented by a float (even if the fractional part is 0) Python Programming, 2/e**Numeric Data Types**• Python has a special function to tell us the data type of any value. >>> type(3) <class 'int'> >>> type(3.1) <class 'float'> >>> type(3.0) <class 'float'> >>> myInt = 32 >>> type(myInt) <class 'int'> >>> Python Programming, 2/e**Numeric Data Types**• Why do we need two number types? • Values that represent counts can’t be fractional (you can’t have 3 ½ students) • Most mathematical algorithms are very efficient with integers • The float type stores only an approximation to the real number being represented! • Since floats aren’t exact, use an int whenever possible! see this example: >>> 6.1 * 3 18.299999999999997 Python Programming, 2/e**Numeric Data Types**• Operations on ints produce ints, operations on floats produce floats (except / which always gives a float). >>> 3.0+4.0 7.0 >>> 3+4 7 >>> 3.0*4.0 12.0 >>> 3*4 12 >>> 10.0/3.0 3.3333333333333335 >>> 10/3 3.3333333333333335 >>> 10 // 3 3 >>> 10.0 // 3.0 3.0 Python Programming, 2/e**Unfamiliar Numeric Operators**• Integer division (//) produces a whole number as the quotient. • That’s why 10//3 = 3 • % is the “modulus” or “remainder” operator • 10 % 3 = 1 because 1 is the remainder of the integer division of 10 by 3. Python Programming, 2/e**Unfamiliar operators // and %**• 0 // 3 = 0 • 5 // 10 = 0 • 19 // 5 = 3 • 19 % 5 = 4 • 7 % 3 = 1 • 7 % 15 = 7 • 19 % 2 = 1 (as all odd numbers do) Python Programming, 2/e**Resulting data types**• Add, subtract or multiply two ints and you get an int • Divide an int by an int and get a float (using /) • Divide an int by an int and get an int (using //) • If there is at least one float involved in the operation, the final result is a float Python Programming, 2/e**Using the Math Library**• Besides abs(), we have lots of other math functions available in a math library • A library is a module with some useful definitions/functions • You do NOT have to import the math library to use math operators like +,-, *, /, //, %, ** Python Programming, 2/e**Using the Math Library**• Let’s write a program to compute the roots of a quadratic equation! • The only part of this we don’t know how to do is find a square root… but it’s in the math library! Python Programming, 2/e**Using the Math Library**• To use a library, we need to make sure this line is in our program:import math • Importing a library makes whatever functions are defined within it available to the program. • This line should be put near the top of the program, before any functions Python Programming, 2/e**Using the Math Library**• To access the sqrt library routine, we need to access it as math.sqrt(x). • Using this dot notation tells Python to use the sqrt function found in the math library module. • To calculate the root, you can dodiscRoot = math.sqrt(b*b – 4*a*c) Python Programming, 2/e**Using the Math Library**# quadratic.py # A program that computes the real roots of a quadratic equation. # Illustrates use of the math library. # Note: This program crashes if the equation has no real roots. import math # Makes the math library available. def main(): print("This program finds the real solutions to a quadratic") print() a, b, c = eval(input("Please enter the coefficients (a, b, c): ")) discRoot = math.sqrt(b * b - 4 * a * c) root1 = (-b + discRoot) / (2 * a) root2 = (-b - discRoot) / (2 * a) print() print("The solutions are:", root1, root2 ) main() Python Programming, 2/e**Using the Math Library**This program finds the real solutions to a quadratic Please enter the coefficients (a, b, c): 3, 4, -1 The solutions are: 0.215250437022 -1.54858377035 • What do you suppose this means? This program finds the real solutions to a quadratic Please enter the coefficients (a, b, c): 1, 2, 3 Traceback (most recent call last): File "<pyshell#26>", line 1, in -toplevel- main() File "C:\Documents and Settings\Terry\My Documents\Teaching\W04\CS 120\Textbook\code\chapter3\quadratic.py", line 14, in main discRoot = math.sqrt(b * b - 4 * a * c) ValueError: math domain error >>> Python Programming, 2/e**Math Library**• If a = 1, b = 2, c = 3, then we are trying to take the square root of a negative number! • Using the sqrt function is more efficient than using **. How could you use ** to calculate a square root? Python Programming, 2/e**Math Library**• Alternate forms of import • from math import * • from math import sqrt • Then don’t have to say math.sqrt • Can just say disc = sqrt(…) • http://docs.python.org/library/math.html for complete list of math functions Python Programming, 2/e**Accumulating Results: Factorial**• Say you are waiting in a line with five other people. How many ways are there to arrange the six people? • 720 -- 720 is the factorial of 6 (abbreviated 6!) • Factorial is defined as:n! = n(n-1)(n-2)…(1) • So, 6! = 6*5*4*3*2*1 = 720 Python Programming, 2/e**Accumulating Results: Factorial**• How we could we write a program to do this? • Input number to take factorial of, nCompute factorial of n, call it factOutput fact Python Programming, 2/e**Accumulating Results: Factorial**• How did we calculate 6!? • 6*5 = 30 • Take that 30, and 30 * 4 = 120 • Take that 120, and 120 * 3 = 360 • Take that 360, and 360 * 2 = 720 • Take that 720, and 720 * 1 = 720 Python Programming, 2/e**Accumulating Results: Factorial**• What’s really going on? • We’re doing repeated multiplications, and we’re keeping track of the running product. • This algorithm is known as an accumulator, because we’re building up or accumulating the answer in a variable, known as the accumulator variable. Python Programming, 2/e**Accumulating Results: Factorial**• The general form of an accumulator algorithm looks like this: Initialize the accumulator variable Loop until final result is reachedupdate the value of accumulator – the pattern must be accumulator = accumulator operator operand The accumulator must appear on LHS and RHS ! Python Programming, 2/e**Accumulating Results: Factorial**• It looks like we’ll need a loop! fact = 1 for factor in [6, 5, 4, 3, 2, 1]:fact = fact * factor • Let’s trace through it to verify that this works! Python Programming, 2/e**Accumulating Results: Factorial**• Why did we need to initialize fact to 1? There are a couple reasons… • Each time through the loop, the previous value of fact is used to calculate the next value of fact. By doing the initialization, you know fact will have a value the first time through. (like clearing a calculator display before adding a series of numbers) • If you use fact without assigning it a value, what does Python do? Python Programming, 2/e**Accumulating Results: Factorial**• Since multiplication is associative and commutative, we can rewrite our program as: fact = 1 for factor in [2, 3, 4, 5, 6]:fact = fact * factor • Great! But what if we want to find the factorial of some other number?? Python Programming, 2/e**Accumulating Results: Factorial**• What does range(n) return?0, 1, 2, 3, …, n-1 • range has another optional parameter! range(start, n) returnsstart, start + 1, …, n-1 • But wait! There’s more!range(start, n, step)start, start+step, …, n-1 • list(<sequence>) to make a list Python Programming, 2/e**Accumulating Results: Factorial**• Let’s try some examples! >>> for i in range(10): print (i, end=“”) # gives 0 1 2 3 4 5 6 7 8 9 >>> for i in range(5,10): print(i, end=“”) # gives 5 6 7 8 9 >>> for i in range(5,10,2): print(i, end=“”) # gives 5 7 9 >>> for i in range(10, 5, -1): print(i, end=“”) # gives 10 9 8 7 6 Python Programming, 2/e**Accumulating Results: Factorial**• Using this enhanced range statement, we can do the range for our loop a couple different ways. • We can count up from 2 to n:range(2, n+1)(Why did we have to use n+1?) • We can count down from n to 2:range(n, 1, -1) Python Programming, 2/e**Accumulating Results: Factorial**• Our completed factorial program: # factorial.py # Program to compute the factorial of a number # Illustrates for loop with an accumulator def main(): n = eval(input("Please enter a whole number: ")) fact = 1 for factor in range(n,1,-1): fact = fact * factor print("The factorial of", n, "is", fact) main() Python Programming, 2/e**The Limits of Int**• What is 100!? >>> main() Please enter a whole number: 100 The factorial of 100 is 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 • Wow! That’s a pretty big number! Python Programming, 2/e**The Limits of Int**• Earlier versions of Python had a fixed limit on the size of integer numbers • If you exceeded it you got an error message “Overflow” (also seen in other languages) • Newer versions of Python can handle it • High level languages like C++ and Java have a fixed size also, and will give either less precise answers or totally incorrect answers Python Programming, 2/e**The Limits of Int**• What’s going on? • While there are an infinite number of integers, there is a finite range of ints that can be represented. • This range depends on the number of bits a particular CPU uses to represent an integer value. Typical PCs use 32 bits. Python Programming, 2/e**The Limits of Int**• Typical PCs use 32 bits • That means there are 232 possible values, centered at 0. • This range then is –231 to 231-1. We need to subtract one from the top end to account for 0. • But our 100! is much larger than this. How does it work? Python Programming, 2/e**Handling Large Numbers**• Does switching to float data types get us around the limitations of ints? • If we initialize the accumulator to 1.0, we get >>> main() Please enter a whole number: 15 The factorial of 15 is 1.307674368e+012 • We no longer get an exact answer! Python Programming, 2/e**Handling Large Numbers: Long Int**• Very large and very small numbers are expressed in scientific or exponential notation. • 1.307674368e+012 means 1.307674368 * 1012 • Here the decimal needs to be moved right 12 decimal places to get the original number, but there are only 9 digits, so 3 digits of precision have been lost. Python Programming, 2/e**Storing floating point numbers**• 3.4523e5 is a floating point number • A floating point number has two parts • The mantissa or fraction (3.4523 above) • The exponent on the 10 (5 above) • Both these are stored in memory to represent the number Python Programming, 2/e**Floating point arithmetic**• FP arithmetic is slower than integer arithmetic • Why? • When numbers have decimals, the decimals have to “be lined up” before you can operate on them – this takes extra time that ints don’t need • 3.2e5 + 7.8e3 is NOT 10.0e8 !! Python Programming, 2/e**Handling Large Numbers**• Floats are approximations • Floats allow us to represent a larger range of values, but with lower precision (roughly 1e300). • Python has a solution, expanding ints! • Python ints are not a fixed size and expand to handle whatever value it holds. Python Programming, 2/e**Handling Large Numbers**• Newer versions of Python automatically convert your ints to expanded form when they grow so large as to overflow. • We get indefinitely large values (e.g. 100!) at the cost of speed and memory • The larger the numbers, the more memory to store them, and the more time it takes to calculate with them • There is STILL an upper limit – a machine only has so much memory after all! Python Programming, 2/e**Type Conversions**• We know that combining an int with an int produces an int, and combining a float with a float produces a float. • What happens when you mix an int and float in an expression?x = 5.0 + 2 • What do you think should happen? Python Programming, 2/e**Type Conversions**• For Python to evaluate this expression, it must either convert 5.0 to 5 and do an integer addition, or convert 2 to 2.0 and do a floating point addition. • Converting a float to an int will lose information • Ints can be converted to floats by adding “.0” Python Programming, 2/e**Type Conversion**• In mixed-typed expressions Python will convert ints to floats. • Sometimes we want to control the type conversion. This is called explicit typing or type casting. Python Programming, 2/e**Type Conversions**>>> float(22//5) 4.0 >>> int(4.5) 4 >>> int(3.9) 3 >>> round(3.9) 4 >>> round(3) 3 Python Programming, 2/e**Type Conversions**• It is better to use the type conversion functions • You are documenting the fact that you are changing types, that it is not an accident, you meant to do it • x = float(5//3) x is 1.0, not 1.666667 Python Programming, 2/e**Python concepts you should now be familiar with**• int, float • range (all forms – 1,2,3 arguments) • round • operators on page 58 (esp. abs, //, %) • import keyword • math library (how to use it, do not have to memorize functions in it) Python Programming, 2/e