To start this guide, download this zip file.
Tuples
A tuple is a collection of one or more values, designated with parentheses:
student = ('Emma Johns', 22, 'political science')In this case, the values might represent a student’s name, age, and major.
Tuples are immutable
A tuple is not mutable (changeable). In other words, it is immutable (not changeable).
Remember, we can change a list by appending something to it:
names = ['Anna', 'Angela']
names.append('Amy')However, we cannot change a tuple. If we try:
student = ('Emma Johns', 22, 'political science')
student.append('3.92')then we get an error:
Traceback (most recent call last):
  File "/Users/zappala/Documents/cs110/tuples.py", line 8, in <module>
    student.append('3.92')
AttributeError: 'tuple' object has no attribute 'append'Unpacking
Let’s imagine we want to be able to print some information about a student. To do this, we could print the tuple directly:
student = ('Emma Johns', 22, 'political science')
print(student)This will print:
('Emma Johns', 22, 'political science')So just like printing a list will print it with the square brackets, printing a tuple will show the parentheses.
A much better way to do this is to unpack the tuple. Unpacking takes each of the parts of the tuple and stores them in separate variables:
name, age, major = ('Emma Johns', 22, 'political science')
print(f'{name} is {age} years old and a {major} major')We now have three separate variables, name, age, and major instead of just
student. We can print those using a formatted string.
Returning multiple values
Tuples are particularly helpful for returning multiple values from a function.
This function sorts two values, a and b, returning the values in sorted
order:
def sorted_order(a, b):
    """Return a and b in ascending order"""
    if a < b:
        return a, b
    else:
        return b, aNotice that we can often leave off the parentheses when returning values from a function.
We can call this function:
if __name__ == '__main__':
    first, second = sorted_order(4, 2)
    print(f'First comes {first}, then comes {second}')And this will print:
First comes 2, then comes 4In fact, this function will work with strings as well. We can call it as:
if __name__ == '__main__':
    first, second = sorted_order('Amy', 'Angela')
    print(f'First comes {first}, then comes {second}')and this will print:
First comes Amy, then comes AngelaYou can find this code in sorting.py in the zip file above.
Here is another example:
def smallest_word(words: list[str]) -> tuple[str, int]:
    """Return the smallest word along with its length"""
    smallest = None
    for word in words:
        if smallest is None or len(word) < len(smallest):
            smallest = word
    return smallest, len(smallest)This function returns both the smallest word and the length of that word.
We can call it like this:
if __name__ == '__main__':
    smallest_word, size = smallest_word(['apple', 'iron', 'cat', 'pigeon'])
    print(f'The smallest word is {smallest_word} and it has length {size}.')and this will print:
The smallest word is cat and it has length 3.Notice how unpacking is particularly helpful when a function returns multiple values!
You can find this file in smallest.py in the zip file above.
Tuples vs lists
It’s important to recognize that lists and tuples fill different roles.
| list | tuple | 
|---|---|
| Can add or remove items | Immutable | 
| Size dynamically determined as the program runs | Size fixed once it is created | 
| Typically stores items of the same type | Often stores items of different types | 
| The items are usually independent of each other | The items usually go together as a unit of information | 
| Typically processed with iteration | Typically processed by unpacking | 
You typically want to use a list when you are working with a list of things that are all the same type and you don’t know how many items you will have until you run the program
You typically want to use a tuple when you are returning several values from a function or if you know in advance exactly how many items how will have (and this never changes)