Home Tutorials Tutorial on Unpacking Operators in MicroPython

Tutorial on Unpacking Operators in MicroPython

by shedboy71
MicroPython, like regular Python, supports unpacking operators that allow you to extract and assign elements from sequences (like lists, tuples, and dictionaries) into variables.
Unpacking operators can make your code more readable and concise by handling groups of elements in data structures efficiently.

This tutorial will guide you through the use of unpacking operators in MicroPython, including examples of sequence unpacking and using the * and ** operators for unpacking elements in various contexts.

Table of Contents:

 

1. What is Unpacking?

Unpacking refers to the process of assigning the values from a sequence (like a list, tuple, or dictionary) to individual variables. This is commonly used when you want to extract multiple values from a sequence in a single line.

Example of Basic Unpacking:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
coordinates = (10, 20, 30)
x, y, z = coordinates
print(x, y, z) # Output: 10 20 30
coordinates = (10, 20, 30) x, y, z = coordinates print(x, y, z) # Output: 10 20 30
coordinates = (10, 20, 30)
x, y, z = coordinates
print(x, y, z)  # Output: 10 20 30

Here, the tuple coordinates is unpacked into the variables x, y, and z.

2. Basic Sequence Unpacking

You can unpack lists, tuples, and other iterable sequences directly into variables. The number of variables on the left side must match the number of elements in the sequence.

Example: Unpacking a Tuple

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
data = ('Alice', 30, 'New York')
name, age, city = data
print(name) # Output: Alice
print(age) # Output: 30
print(city) # Output: New York
data = ('Alice', 30, 'New York') name, age, city = data print(name) # Output: Alice print(age) # Output: 30 print(city) # Output: New York
data = ('Alice', 30, 'New York')
name, age, city = data
print(name)  # Output: Alice
print(age)   # Output: 30
print(city)  # Output: New York

Example: Unpacking a List

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
numbers = [1, 2, 3]
a, b, c = numbers
print(a, b, c) # Output: 1 2 3
numbers = [1, 2, 3] a, b, c = numbers print(a, b, c) # Output: 1 2 3
numbers = [1, 2, 3]
a, b, c = numbers
print(a, b, c)  # Output: 1 2 3

If the number of elements in the sequence does not match the number of variables, you will get a ValueError.

Example: Handling Mismatched Elements

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
numbers = [1, 2, 3, 4]
# Uncommenting the line below will raise a ValueError
# a, b, c = numbers # Raises: ValueError: too many values to unpack (expected 3)
numbers = [1, 2, 3, 4] # Uncommenting the line below will raise a ValueError # a, b, c = numbers # Raises: ValueError: too many values to unpack (expected 3)
numbers = [1, 2, 3, 4]

# Uncommenting the line below will raise a ValueError
# a, b, c = numbers  # Raises: ValueError: too many values to unpack (expected 3)

3. Using the * Operator for Extended Unpacking

The * operator allows you to unpack multiple elements into a single variable. This is useful when you don’t know the exact number of elements or want to capture the rest of the elements in a sequence.

Example: Unpacking with *

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
numbers = [1, 2, 3, 4, 5]
# The first element is assigned to 'a', and the rest are captured in 'b'
a, *b = numbers
print(a) # Output: 1
print(b) # Output: [2, 3, 4, 5]
# Capturing the last element
*a, b = numbers
print(a) # Output: [1, 2, 3, 4]
print(b) # Output: 5
# Capturing elements in the middle
a, *b, c = numbers
print(a) # Output: 1
print(b) # Output: [2, 3, 4]
print(c) # Output: 5
numbers = [1, 2, 3, 4, 5] # The first element is assigned to 'a', and the rest are captured in 'b' a, *b = numbers print(a) # Output: 1 print(b) # Output: [2, 3, 4, 5] # Capturing the last element *a, b = numbers print(a) # Output: [1, 2, 3, 4] print(b) # Output: 5 # Capturing elements in the middle a, *b, c = numbers print(a) # Output: 1 print(b) # Output: [2, 3, 4] print(c) # Output: 5
numbers = [1, 2, 3, 4, 5]

# The first element is assigned to 'a', and the rest are captured in 'b'
a, *b = numbers
print(a)  # Output: 1
print(b)  # Output: [2, 3, 4, 5]

# Capturing the last element
*a, b = numbers
print(a)  # Output: [1, 2, 3, 4]
print(b)  # Output: 5

# Capturing elements in the middle
a, *b, c = numbers
print(a)  # Output: 1
print(b)  # Output: [2, 3, 4]
print(c)  # Output: 5

Explanation:

The * operator captures “the rest” of the sequence into a list, allowing for more flexible unpacking.

4. Unpacking Dictionaries with **

The ** operator can be used to unpack dictionaries. This is often used in functions to accept variable keyword arguments or to combine dictionaries.

Example: Unpacking a Dictionary into Function Parameters

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def show_info(name, age, city):
print(f"Name: {name}, Age: {age}, City: {city}")
person_info = {'name': 'Alice', 'age': 30, 'city': 'New York'}
# Unpacking dictionary into function parameters
show_info(**person_info)
# Output: Name: Alice, Age: 30, City: New York
def show_info(name, age, city): print(f"Name: {name}, Age: {age}, City: {city}") person_info = {'name': 'Alice', 'age': 30, 'city': 'New York'} # Unpacking dictionary into function parameters show_info(**person_info) # Output: Name: Alice, Age: 30, City: New York
def show_info(name, age, city):
    print(f"Name: {name}, Age: {age}, City: {city}")

person_info = {'name': 'Alice', 'age': 30, 'city': 'New York'}

# Unpacking dictionary into function parameters
show_info(**person_info)
# Output: Name: Alice, Age: 30, City: New York

Example: Merging Dictionaries with **

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
# Merging dictionaries using `**`
merged_dict = {**dict1, **dict2}
print(merged_dict) # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
dict1 = {'a': 1, 'b': 2} dict2 = {'c': 3, 'd': 4} # Merging dictionaries using `**` merged_dict = {**dict1, **dict2} print(merged_dict) # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

# Merging dictionaries using `**`
merged_dict = {**dict1, **dict2}
print(merged_dict)  # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Explanation:

The ** operator unpacks all key-value pairs from dict1 and dict2 into a new dictionary, merged_dict.

5. Practical Examples with Unpacking Operators

Example 1: Swapping Variables

One of the classic uses of unpacking is swapping the values of two variables.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
a = 5
b = 10
# Swapping variables using unpacking
a, b = b, a
print(a, b) # Output: 10 5
a = 5 b = 10 # Swapping variables using unpacking a, b = b, a print(a, b) # Output: 10 5
a = 5
b = 10

# Swapping variables using unpacking
a, b = b, a
print(a, b)  # Output: 10 5

Example 2: Splitting a List into Head and Tail

You can use the * operator to split a list into the first element (head) and the rest of the elements (tail).

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
numbers = [1, 2, 3, 4, 5]
# Splitting into head and tail
head, *tail = numbers
print(head) # Output: 1
print(tail) # Output: [2, 3, 4, 5]
numbers = [1, 2, 3, 4, 5] # Splitting into head and tail head, *tail = numbers print(head) # Output: 1 print(tail) # Output: [2, 3, 4, 5]
numbers = [1, 2, 3, 4, 5]

# Splitting into head and tail
head, *tail = numbers
print(head)  # Output: 1
print(tail)  # Output: [2, 3, 4, 5]

Example 3: Handling Variable-Length Tuples

When working with tuples of varying lengths, the * operator can be used to capture the remaining elements.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
data = ('Alice', 30, 'New York', 'Engineer')
# Unpacking with `*` to handle extra elements
name, *details = data
print(name) # Output: Alice
print(details) # Output: [30, 'New York', 'Engineer']
data = ('Alice', 30, 'New York', 'Engineer') # Unpacking with `*` to handle extra elements name, *details = data print(name) # Output: Alice print(details) # Output: [30, 'New York', 'Engineer']
data = ('Alice', 30, 'New York', 'Engineer')

# Unpacking with `*` to handle extra elements
name, *details = data
print(name)    # Output: Alice
print(details) # Output: [30, 'New York', 'Engineer']

Example 4: Using ** to Pass Variable Keyword Arguments

The ** operator is useful when you have a dictionary of parameters that need to be passed to a function.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def create_user(name, age, city):
return {'name': name, 'age': age, 'city': city}
user_data = {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}
# Using `**` to pass dictionary as keyword arguments
user = create_user(**user_data)
print(user) # Output: {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}
def create_user(name, age, city): return {'name': name, 'age': age, 'city': city} user_data = {'name': 'Bob', 'age': 25, 'city': 'San Francisco'} # Using `**` to pass dictionary as keyword arguments user = create_user(**user_data) print(user) # Output: {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}
def create_user(name, age, city):
    return {'name': name, 'age': age, 'city': city}

user_data = {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}

# Using `**` to pass dictionary as keyword arguments
user = create_user(**user_data)
print(user)  # Output: {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}

Conclusion

Unpacking operators (* and **) in MicroPython provide a concise and flexible way to handle sequences and dictionaries. They allow you to:

Extract elements from sequences into variables.
Use the * operator to capture multiple elements in a sequence.
Unpack dictionaries into function parameters using **.
Merge dictionaries or handle variable-length argument lists.
By mastering unpacking operators, you can write more readable and efficient MicroPython code, especially when dealing with complex data structures.

You may also like