In Python, everything is an object. Data types are really classes and the variables we define are instances of those classes. Data types in Python differ based on number of values they can contain, their mutability, and their order.

There are two functions available to check the type of a variable. The type() function will return the data type of the variable that is passed to it. The isinstance() function can check if a variable’s data type matches the one we provide. I’ll use these functions below to illustrate the various data types.

Numbers

There are 3 kinds of numbers in Python: integers (int), floating-points (float), and complex numbers (complex).

Integers are simple whole numbers, such as 0 or 1. Their maximum value is limited only by the amount of memory available. For example:

>>> my_var = 1
>>> type(my_var)
<class 'int'>
>>> isinstance(my_var, int)
True

Floating-point numbers are those which contain an integer part and a fractional part and contain a decimal symbol. They are accurate upto 15 decimal places and are truncated after that. For example:

>>> my_var = 1.0
>>> type(my_var)
<class 'float'>
>>> isinstance(my_var, float)
True

>>> my_var = 1.01234567891011121314151617181920
>>> print(my_var)
1.0123456789101113

Complex numbers are those which contain a real part and an imaginary part. They are usually denoted in the format x+yj.

>>> my_var = 1 + 2j
>>> type(my_var)
<class 'complex'>
>>> isinstance(my_var, complex)
True

Strings

A string in Python is an immutable and ordered sequence of items. They can be defined using single-quotes (') or double-quotes ("). A string spanning multiple lines can be defined using triple single-quotes (''') or triple double-quotes ("""). For example:

>>> my_var = 'This is a string'
>>> type(my_var)
<class 'str'>
>>> isinstance(my_var, str)
True

>>> my_string = """This is
... my
... first
... string"""
>>> print(my_string)
This is
my
first
string
>>> my_string_2 = '''
... This
... is
... my
... second
... string
... '''
>>> print(my_string_2)

This
is
my
second
string

Since strings in Python are ordered, we can extract individual characters from a string using their integer indices, starting with 0. The first letter of a string is always at position 0, and the positions numerically increase after that. For example:

>>> my_var = 'This is a string'
>>> my_var[0]
'T'
>>> my_var[10]
's'

Strings in Python also support slicing. Slicing is a technique which is used to extract a part of a variable using the notation [start_position:end_position], where start_position and end_position are integers indicating the length of the slice. If start_position is omitted, then slicing begins at the beginning of the string, and if end_position is omitted, then slicing ends at the end of the string. For example:

>>> my_var[0:1]
'T'
>>> my_var[0:]
'This is a string'
>>> my_var[:-1]
'This is a strin'
>>> my_var[:len(my_var)]
'This is a string'

Lists and Tuples

A list is an iterable, ordered, and mutable collection of items. It is like an array() in other programming languages. A list can contain any type of items.

>>> my_var = [1, 2, 3, 4, 5]
>>> type(my_var)
<class 'list'>
>>> isinstance(my_var, list)
True

Like strings, lists are ordered as well. Which means that they support extracting individual items using numerical indices. Using an index that is larger than the length of the string will produce an index out of range error.

>> my_var[0]
1
>>> my_var[4]
5
>>> my_var[10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Lists also support slicing. For example:

>>> my_var[0:]
[1, 2, 3, 4, 5]
>>> my_var[0:1]
[1]
>>> my_var[:-1]
[1, 2, 3, 4]
>>> my_var[:len(my_var)]
[1, 2, 3, 4, 5]

A tuple is exactly the same as a list, but with one difference: tuples are immutable. This means that once a tuple is defined, its value cannot be changed.

>>> my_var = (1, 2, 3, 4, 5)
>>> type(my_var)
<class 'tuple'>
>>> isinstance(my_var, tuple)
True

Tuples are great for write-protecting data, and are usually faster than lists because they cannot be dynamically altered. In the example below, trying to change the value of a tuple produces an error.

>>> my_var[0] = 100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

Tuples, like lists, also support extracting elements using integer indices.

>>> my_var[0]
1
>>> my_var[4]
5
>>> my_var[10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

Tuples also support slicing.

>>> my_var[0:]
(1, 2, 3, 4, 5)
>>> my_var[0:1]
(1,)
>>> my_var[:-1]
(1, 2, 3, 4)
>>> my_var[:len(my_var)]
(1, 2, 3, 4, 5)

Sets & Dictionaries

A set is an unordered collection of unique items.

>>> my_var = {1, 2, 3, 4, 5}
>>> type(my_var)
<class 'set'>
>>> isinstance(my_var, set)
True

It is used when we want to automatically remove duplicates from a list of items.

>>> no_duplicates = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5}
>>> print(no_duplicates)
{1, 2, 3, 4, 5}

Because it is unordered, it does not support extracting elements using integer indices or slicing. It does, however, support other methods, such as union(), intersection(), and difference().

>>> my_var = {1, 2, 3}
>>> my_var_2 = {4, 5}
>>> my_var.union(my_var_2)
{1, 2, 3, 4, 5}

>>> my_var_2 = {1, 2, 3}
>>> my_var.intersection(my_var_2)
{1, 2, 3}

>>> my_var_2 = {4, 5}
>>> my_var.difference(my_var_2)
{1, 2, 3}

A dictionary in Python is an iterable, mutable, and unordered collection of key-value pairs. They are great for storing a large amount of information.

>>> my_var = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
>>> type(my_var)
<class 'dict'>
>>> isinstance(my_var, dict)
True

Like Sets, the keys in a dictionary must be unique.

>>> no_duplicates = {"a": 1, "a": 11, "b": 2, "b": 22, "c": 3, "c": "33", "d": 4, "e": 5}
>>> print(no_duplicates)
{'c': '33', 'e': 5, 'a': 11, 'd': 4, 'b': 22}

Dictionary values can be retrieved using the key.

>>> my_var = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
>>> my_var['a']
1
>>> my_var['d']
4

Type Casting

The various data types listed above can be cast, or converted, from one to the other. Casting is performed by using the data type’s class constructor, such as int(), float(), str(), list(), tuple(), set(), and dict().

Casting to int

Floats and strings can be converted to integers.

>>> print(int(1.0))
1
>>> print(int("1"))
1

Casting to float

Integers and strings can be converted to floating-points.

>>> print(float(1))
1.0
>>> print(float("1"))
1.0

Casting to complex

Integers, floating-points, and strings can be converted to complex numbers.

>>> print(complex(1))
(1+0j)
>>> print(complex(1.0))
(1+0j)
>>> print(complex("1+1j"))
(1+1j)

Casting to list

Strings, tuples, sets, and dictionaries can be converted to lists.

>>> print(list("12345"))
['1', '2', '3', '4', '5']
>>> 
>>> print(list(tuple("12345")))
['1', '2', '3', '4', '5']
>>> 
>>> print(list({1, 2, 3, 4, 5}))
[1, 2, 3, 4, 5]
>>> 
>>> print(list({"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}))
['c', 'd', 'e', 'b', 'a']

Casting to tuple

Strings, lists, sets, and dictionaries can be converted to tuples.

>>> print(tuple("12345"))
('1', '2', '3', '4', '5')
>>>
>>> print(tuple(list("12345")))
('1', '2', '3', '4', '5')
>>>
>>> print(tuple({1, 2, 3, 4, 5}))
(1, 2, 3, 4, 5)
>>>
>>> print(tuple({"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}))
('c', 'd', 'e', 'b', 'a')

Casting to set

Strings, lists, tuples, and dictionaries can be converted to tuples.

>>> print(set("12345"))
{'4', '5', '2', '1', '3'}
>>>
>>> print(set([1, 2, 3, 4, 5]))
{1, 2, 3, 4, 5}
>>>
>>> print(set((1, 2, 3, 4, 5)))
{1, 2, 3, 4, 5}
>>>
>>> print(set({"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}))
{'c', 'd', 'e', 'b', 'a'}

Casting to dictionary

Lists, tuples, or sets can be converted to a dictionary if they are provided in pairs. Sets can only be converted to dictionaries if they are provided within a list or a tuple.

>>> print(dict([[1, 2], [3, 4], [5, 6]]))
{1: 2, 3: 4, 5: 6}
>>>
>>> print(dict(((1, 2), (3, 4), (5, 6))))
{1: 2, 3: 4, 5: 6}
>>>
>>> print(dict([{1, 2}, {3, 4}, {5, 6}]))
{1: 2, 3: 4, 5: 6}

Conclusion

As you can see, the various number and string data types can be easily converted from one to the other. Similarly, the iterable data types can be converted from one to the other. Note, however, that certain conversions lead to loss of data, such as when converting from float to int or when converting from dictionary to set. There will be loss of data when type casting from a higher data type to a lower data type.

Resources