Data Types and Type Conversion
Last updated on 20230502  Edit this page
Overview
Questions
 What kinds of data do programs store?
 How can I convert one type to another?
Objectives
 Explain key differences between integers and floating point numbers.
 Explain key differences between numbers and character strings.
 Use builtin functions to convert between integers, floating point numbers, and strings.
Every value has a type.
 Every value in a program has a specific type.
 Integer (
int
): represents positive or negative whole numbers like 3 or 512.  Floating point number (
float
): represents real numbers like 3.14159 or 2.5.  Character string (usually called “string”,
str
): text. Written in either single quotes or double quotes (as long as they match).
 The quote marks aren’t printed when the string is displayed.
Use the builtin function type
to find the type of a
value.
 Use the builtin function
type
to find out what type a value has.  Works on variables as well.
 But remember: the value has the type — the variable is just a label.
PYTHON
print(type(52))
OUTPUT
<class 'int'>
PYTHON
= 'average'
fitness print(type(fitness))
OUTPUT
<class 'str'>
Types control what operations (or methods) can be performed on a given value.
 A value’s type determines what the program can do to it.
PYTHON
print(5  3)
OUTPUT
2
PYTHON
print('hello'  'h')
ERROR

TypeError Traceback (most recent call last)
<ipythoninput267f5626a1e07> in <module>()
> 1 print('hello'  'h')
TypeError: unsupported operand type(s) for : 'str' and 'str'
You can use the “+” and “*” operators on strings.
 “Adding” character strings concatenates them.
PYTHON
= 'Ahmed' + ' ' + 'Walsh'
full_name print(full_name)
OUTPUT
Ahmed Walsh
 Multiplying a character string by an integer N creates a
new string that consists of that character string repeated N
times.
 Since multiplication is repeated addition.
PYTHON
= '=' * 10
separator print(separator)
OUTPUT
==========
Strings have a length (but numbers don’t).
 The builtin function
len
counts the number of characters in a string.
PYTHON
print(len(full_name))
OUTPUT
11
 But numbers don’t have a length (not even zero).
PYTHON
print(len(52))
ERROR

TypeError Traceback (most recent call last)
<ipythoninput3f769e8e8097d> in <module>()
> 1 print(len(52))
TypeError: object of type 'int' has no len()
Must convert numbers to strings or vice versa when operating on them.
 Cannot add numbers and strings.
PYTHON
print(1 + '2')
ERROR

TypeError Traceback (most recent call last)
<ipythoninput4fe4f54a023c6> in <module>()
> 1 print(1 + '2')
TypeError: unsupported operand type(s) for +: 'int' and 'str'
 Not allowed because it’s ambiguous: should
1 + '2'
be3
or'12'
?  Some types can be converted to other types by using the type name as a function.
PYTHON
print(1 + int('2'))
print(str(1) + '2')
OUTPUT
3
12
Can mix integers and floats freely in operations.
 Integers and floatingpoint numbers can be mixed in arithmetic.
 Python 3 automatically converts integers to floats as needed.
PYTHON
print('half is', 1 / 2.0)
print('three squared is', 3.0 ** 2)
OUTPUT
half is 0.5
three squared is 9.0
Variables only change value when something is assigned to them.
 If we make one cell in a spreadsheet depend on another, and update the latter, the former updates automatically.
 This does not happen in programming languages.
PYTHON
= 1
variable_one = 5 * variable_one
variable_two = 2
variable_one print('first is', variable_one, 'and second is', variable_two)
OUTPUT
first is 2 and second is 5
 The computer reads the value of
variable_one
when doing the multiplication, creates a new value, and assigns it tovariable_two
.  Afterwards, the value of
variable_two
is set to the new value and not dependent onvariable_one
so its value does not automatically change whenvariable_one
changes.
It is a floatingpoint number (often abbreviated “float”). It is
possible to find out by using the builtin function
type()
.
PYTHON
print(type(3.4))
OUTPUT
<class 'float'>
It is a float: integers are automatically converted to floats as necessary.
PYTHON
= 3.25 + 4
result print(result, 'is', type(result))
OUTPUT
7.25 is <class 'float'>
Choose a Type
What type of value (integer, floating point number, or character string) would you use to represent each of the following? Try to come up with more than one good answer for each problem. For example, in # 1, when would counting days with a floating point variable make more sense than using an integer?
 Number of days since the start of the year.
 Time elapsed from the start of the year until now in days.
 Serial number of a piece of lab equipment.
 A lab specimen’s age
 Current population of a city.
 Average population of a city over time.
The answers to the questions are:
 Integer, since the number of days would lie between 1 and 365.
 Floating point, since fractional days are required
 Character string if serial number contains letters and numbers, otherwise integer if the serial number consists only of numerals
 This will vary! How do you define a specimen’s age? whole days since collection (integer)? date and time (string)?
 Choose floating point to represent population as large aggregates (eg millions), or integer to represent population in units of individuals.
 Floating point number, since an average is likely to have a fractional part.
Division Types
In Python 3, the //
operator performs integer
(wholenumber) floor division, the /
operator performs
floatingpoint division, and the %
(or modulo)
operator calculates and returns the remainder from integer division:
PYTHON
print('5 // 3:', 5 // 3)
print('5 / 3:', 5 / 3)
print('5 % 3:', 5 % 3)
OUTPUT
5 // 3: 1
5 / 3: 1.6666666666666667
5 % 3: 2
If num_subjects
is the number of subjects taking part in
a study, and num_per_survey
is the number that can take
part in a single survey, write an expression that calculates the number
of surveys needed to reach everyone once.
We want the minimum number of surveys that reaches everyone once,
which is the rounded up value of
num_subjects/ num_per_survey
. This is equivalent to
performing a floor division with //
and adding 1. Before
the division we need to subtract 1 from the number of subjects to deal
with the case where num_subjects
is evenly divisible by
num_per_survey
.
PYTHON
= 600
num_subjects = 42
num_per_survey = (num_subjects  1) // num_per_survey + 1
num_surveys
print(num_subjects, 'subjects,', num_per_survey, 'per survey:', num_surveys)
OUTPUT
600 subjects, 42 per survey: 15
Strings to Numbers
Where reasonable, float()
will convert a string to a
floating point number, and int()
will convert a floating
point number to an integer:
PYTHON
print("string to float:", float("3.4"))
print("float to int:", int(3.4))
OUTPUT
string to float: 3.4
float to int: 3
If the conversion doesn’t make sense, however, an error message will occur.
PYTHON
print("string to float:", float("Hello world!"))
ERROR

ValueError Traceback (most recent call last)
<ipythoninput5df3b790bf0a2> in <module>
> 1 print("string to float:", float("Hello world!"))
ValueError: could not convert string to float: 'Hello world!'
Given this information, what do you expect the following program to do?
What does it actually do?
Why do you think it does that?
PYTHON
print("fractional string to int:", int("3.4"))
What do you expect this program to do? It would not be so
unreasonable to expect the Python 3 int
command to convert
the string “3.4” to 3.4 and an additional type conversion to 3. After
all, Python 3 performs a lot of other magic  isn’t that part of its
charm?
PYTHON
int("3.4")
OUTPUT

ValueError Traceback (most recent call last)
<ipythoninput2ec6729dfccdc> in <module>
> 1 int("3.4")
ValueError: invalid literal for int() with base 10: '3.4'
However, Python 3 throws an error. Why? To be consistent, possibly. If you ask Python to perform two consecutive typecasts, you must convert it explicitly in code.
PYTHON
int(float("3.4"))
OUTPUT
3
Arithmetic with Different Types
Which of the following will return the floating point number
2.0
? Note: there may be more than one right answer.
PYTHON
= 1.0
first = "1"
second = "1.1" third
first + float(second)
float(second) + float(third)
first + int(third)
first + int(float(third))
int(first) + int(float(third))
2.0 * second
Answer: 1 and 4
Complex Numbers
Python provides complex numbers, which are written as
1.0+2.0j
. If val
is a complex number, its real
and imaginary parts can be accessed using dot notation as
val.real
and val.imag
.
PYTHON
= 6 + 2j
a_complex_number print(a_complex_number.real)
print(a_complex_number.imag)
OUTPUT
6.0
2.0
 Why do you think Python uses
j
instead ofi
for the imaginary part?  What do you expect
1 + 2j + 3
to produce?  What do you expect
4j
to be? What about4 j
or4 + j
?
 Standard mathematics treatments typically use
i
to denote an imaginary number. However, from media reports it was an early convention established from electrical engineering that now presents a technically expensive area to change. Stack Overflow provides additional explanation and discussion. (4+2j)

4j
andSyntax Error: invalid syntax
. In the latter cases,j
is considered a variable and the statement depends on ifj
is defined and if so, its assigned value.
Keypoints
 Every value has a type.
 Use the builtin function
type
to find the type of a value.  Types control what operations can be done on values.
 Strings can be added and multiplied.
 Strings have a length (but numbers don’t).
 Must convert numbers to strings or vice versa when operating on them.
 Can mix integers and floats freely in operations.
 Variables only change value when something is assigned to them.