Python Programming:
An Introduction to
Computer Science
Chapter 3
Computing with Numbers
Python Programming, 4/e 1
Objectives
To understand the concept of data types in
more depth.
To be familiar with the basic numeric data types
in Python.
To understand the fundamental principles of
how numbers are represented on a computer.
Python Programming, 4/e 2
Objectives (cont.)
To be able to use the Python math library.
To understand the accumulator program
pattern.
To be able to read and write programs that
process numerical data.
Python Programming, 4/e 3
Numeric Data Types
The information that is stored and manipulated
by computer 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
(.25, .10, .05, .01) are decimal fractions
Python Programming, 4/e 4
Numeric Data Types
# [Link]
# A program to calculate the value of some change in dollars
def main():
print("Change Counter")
print()
print("Please enter the count of each coin type.")
quarters = int(input("Quarters: "))
dimes = int(input("Dimes: "))
nickels = int(input("Nickels: "))
pennies = int(input("Pennies: "))
total = quarters * .25 + dimes * .10 + nickels * .05 + pennies * .01
print()
print("The total of your change is", total)
main()
Python Programming, 4/e 5
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, 4/e 6
Numeric Data Types
Whole numbers are represented using the
integer (int for short) data type.
These values can be positive or negative whole
numbers.
Python Programming, 4/e 7
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 produces
an int value
A literal that has a decimal point is represented by a
float (even if the fractional part is 0)
Python Programming, 4/e 8
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, 4/e 9
Numeric Data Types
Why do we need two number types?
Values that represent counts can’t be fractional (you can’t
have 3 ½ quarters)
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!
Python Programming, 4/e 10
Numeric Data Types
operato operation
r
+ addition
- subtraction
* multiplication
/ float division
** exponentiation
abs() absolute value
// integer
division
% remainder
Python Programming, 4/e 11
Numeric Data Types
Operations on ints produce ints, operations on floats
produce floats (except for /).
>>> 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, 4/e 12
Numeric Data Types
Division (/) produces a float, while
integer division (//) can produce a
whole number.
That’s why 10/3 = 3.3333 while 10//3 =
3!
Think of it as ‘gozinta’, where 10//3 = 3
since 3 gozinta (goes into) 10 3 times
(with a remainder of 1)
10%3 = 1 is the remainder of the
integer division of 10 by 3.
a = (a//b)(b) + (a%b)
Python Programming, 4/e 13
Type Conversions & Rounding
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, 4/e 14
Type Conversions & Rounding
For Python to evaluate this expression, it must
either convert 5.0 to 5 and do an integer
multiplication, or convert 2 to 2.0 and do a
floating point multiplication.
Converting a float to an int will lose information
Ints can be converted to floats by adding “.0”
Python Programming, 4/e 15
Type Conversion & Rounding
In mixed-typed expressions Python will convert
ints to floats.
Sometimes we want to control the type
conversion. This is called explicit typing.
Converting to an int simply discards the
fractional part of a float – the value is
truncated, not rounded.
Python Programming, 4/e 16
Type Conversion & Rounding
To round off numbers, use the built-in round
function which rounds to the nearest whole
value.
If you want to round a float into another float
value, you can supply a second parameter that
specifies the number of digits after the decimal
point.
Python Programming, 4/e 17
Type Conversions & Rounding
>>> float(22//5)
4.0
>>> int(4.5)
4
>>> int(3.9)
3
>>> round(3.9)
4
>>> round(3)
3
>>> round(3.1415926, 2)
3.14
Python Programming, 4/e 18
Type Conversions & Rounding
>>> int("32")
32
>>> float("32")
32.0
str(10)
'10'
str(10.0)
'10.0'
int("10.5")
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
int("10.5")
ValueError: invalid literal for int() with base 10: '10.5'
Python Programming, 4/e 19
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.
Python Programming, 4/e 20
Using the Math Library
Let’s write a program to compute the roots of a
quadratic equation!
−𝑏± √ 𝑏 − 4 𝑎𝑐
2
𝑥=
2𝑎
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, 4/e 21
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.
Python Programming, 4/e 22
Using the Math Library
To access the sqrt library routine, we need to
access it as [Link](x).
Using this dot notation tells Python to use the
sqrt function found in the math library module.
To calculate the root, you can do
discRoot = [Link](b*b – 4*a*c)
Python Programming, 4/e 23
Using the Math Library
# [Link]
# 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 = float(input("Please enter the coefficient a: "))
b = float(input("Please enter the coefficient a: "))
c = float(input("Please enter the coefficient a: "))
discRoot = [Link](b * b - 4 * a * c)
root1 = (-b + discRoot) / (2 * a)
root2 = (-b - discRoot) / (2 * a)
print()
print("The solutions are:", root1, root2 )
Python Programming, 4/e 24
Using the Math Library
This program finds the real solutions to a quadratic
Please enter the coefficient a: 3
Please enter the coefficient a: 4
Please enter the coefficient a: -1
The solutions are: 0.21525043702153024 -1.5485837703548635
What do you suppose this means?
This program finds the real solutions to a quadratic
Please enter the coefficient a: 1
Please enter the coefficient a: 2
Please enter the coefficient a: 3
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
main()
File "C:/Users/terry/Desktop/[Link]", line 16, in main
discRoot = [Link](b * b - 4 * a * c)
ValueError: math domain error
Python Programming, 4/e 25
Using the 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, 4/e 26
Using the Math Library
Python Mathematic English
s
pi An approximation of pi
e e An approximation of e
sqrt(x) √𝑥 The square root of x
sin(x) sin x The sine of x
cos(x) cos x The cosine of x
tan(x) tan x The tangent of x
asin(x) arcsin x The inverse of sine x
acos(x) arccos x The inverse of cosine x
atan(x) arctan x The inverse of tangent x
Python Programming, 4/e 27
Using the Math Library
Python Mathematic English
s
log(x)
logln10x𝑥 The natural (base e) logarithm of x
log10(x) 𝑥 The common (base 10) logarithm of x
exp(x)
𝑒 The exponential of x
ceil(x)
⌈𝑥⌉ The smallest whole number >= x
⌊𝑥 ⌋
floor(x) The largest whole number <= x
Python Programming, 4/e 28
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:
So, 6! = 6*5*4*3*2*1 = 720
Python Programming, 4/e 29
Accumulating Results: Factorial
How we could we write a program to do this?
Input number to take factorial of, n
Compute factorial of n, fact
Output fact
Python Programming, 4/e 30
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, 4/e 31
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, 4/e 32
Accumulating Results: Factorial
The general form of an accumulator algorithm
looks like this:
Initialize the accumulator variable
Loop until final result is reached
update the value of accumulator variable
Python Programming, 4/e 33
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, 4/e 34
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.
If you use fact without assigning it a value, what
does Python do?
Python Programming, 4/e 35
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, 4/e 36
Accumulating Results: Factorial
What does list(range(n)) return?
[0, 1, 2, 3, …, n-1]
range has another optional parameter!
range(start, n) returns
[start, 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, 4/e 37
Accumulating Results: Factorial
Let’s try some examples!
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(5,10))
[5, 6, 7, 8, 9]
>>> list(range(5,10,2))
[5, 7, 9]
Python Programming, 4/e 38
Accumulating Results: Factorial
Using this souped-up 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, 4/e 39
Accumulating Results: Factorial
Our completed factorial program:
# [Link]
# Program to compute the factorial of a number
# Illustrates for loop with an accumulator
def main():
n = int(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, 4/e 40
The Limits of Int
What is 100!?
>>> main()
Please enter a whole number: 100
The factorial of 100 is
9332621544394415268169923885626670049071596826438162146859296389
5217599993229915608941463976156518286253697920827223758251185210
916864000000000000000000000000
Wow! That’s a pretty big number!
Python Programming, 4/e 41
The Limits of Int
Newer versions of Python can handle it, but…
Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import fact
>>> [Link]()
Please enter a whole number: 13
13
12
11
10
9
8
7
6
5
4
Traceback (innermost last):
File "<pyshell#1>", line 1, in ?
[Link]()
File "C:\PROGRA~1\PYTHON~1.2\[Link]", line 5, in main
fact=fact*factor
OverflowError: integer multiplication
Python Programming, 4/e 42
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.
Python Programming, 4/e 43
The Limits of Int
Typical PCs use 32 bits or 64.
In a 32 bit computer 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 -- even
larger than 264. How does it work?
Python Programming, 4/e 44
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: 30
The factorial of 30 is 2.652528598121911e+32
We no longer get an exact answer!
Python Programming, 4/e 45
Handling Large Numbers: Long Int
Very large and very small numbers are expressed in
scientific or exponential notation.
2.652528598121911e+32 means 2.652528598121911
* 1032
Here the decimal needs to be moved right 32 decimal
places to get the original number, but there are only
16 digits, so 16 digits of precision have been lost.
Python Programming, 4/e 46
Handling Large Numbers
Floats are approximations
Floats allow us to represent a larger range of
values, but with fixed precision.
Python has a solution, expanding ints!
Python ints are not a fixed size and expand to
handle whatever value it holds.
Python Programming, 4/e 47
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
Python Programming, 4/e 48