Python Walrus Operator: An Introduction
Tags: python, programming, tutorial
Published: 2023-10-28 19:14:20

Python 3.8 introduced a new operator called the walrus operator, denoted by `:=`. It's called the *Walrus* operator because it looks like the eyes and the tusks of a walrus on its side. This operator allows you to evaluate an expression and assign its value to a variable in a single statement.

## What is the Walrus Operator?

The walrus operator, also known as the assignment expression operator, is a syntax enhancement that has been introduced in Python 3.8. It allows you to assign a value to a variable within an expression. The syntax for the walrus operator is `(variable := expression)` [[1]](https://www.codeconquest.com/blog/python-walrus-operator-uses-and-controversy/).

## Basic Usage

Let's start with a basic example to understand how the walrus operator works. Consider the following code snippet:

```python
walrus = (value := 3357)
print(f"walrus: {walrus}")
print(f"value: {value}")
```

Output:
```
walrus: 3357
value: 3357
```

In this example, we use the walrus operator to define the variable `value` and assign it the value `3357`. The expression `(value := 3357)` returns the assigned value, which we then use to initialize the variable `walrus`. As a result, both variables have the same value [[1]](https://www.codeconquest.com/blog/python-walrus-operator-uses-and-controversy/).

## Use Cases

### 1. If Statements

The walrus operator can be useful in if statements when you want to perform an operation on an unknown variable. For example, let's say you want check if a specific environment variable is set and based on that, you want to execute a set of actions. This is one way it could be done conventionally:

```python
import os
import shutil

def delete_folder_contents():
    # Get the value of the "PGDATA" environment variable
    pgdata_path = os.environ.get("PGDATA", None)
    
    if pgdata_path:
        # Verify if the path exists
        if os.path.exists(pgdata_path):
            # Iterate over the files and folders within the directory
            for filename in os.listdir(pgdata_path):
                file_path = os.path.join(pgdata_path, filename)
                
                # Check if it is a file and delete it
                if os.path.isfile(file_path):
                    os.remove(file_path)
                # Check if it is a directory and delete it recursively
                elif os.path.isdir(file_path):
                    shutil.rmtree(file_path)
                    
            print("Folder contents deleted successfully.")
        else:
            print("The specified path does not exist.")
    else:
        print("The 'PGDATA' environment variable is not set.")

delete_folder_contents()
```

Here's how you can achieve this using the walrus operator:

```python
import os
import shutil

def delete_folder_contents():
    # Verify if the path exists
    if (pgdata_path := os.environ.get("PGDATA", None)) is not None:
        # Check if the path exists
        if os.path.exists(pgdata_path):
            # Iterate over the files and folders within the directory
            for filename in os.listdir(pgdata_path):
                file_path = os.path.join(pgdata_path, filename)
                
                # Check if it is a file and delete it
                if os.path.isfile(file_path):
                    os.remove(file_path)
                # Check if it is a directory and delete it recursively
                elif os.path.isdir(file_path):
                    shutil.rmtree(file_path)
                    
            print("Folder contents deleted successfully.")
        else:
            print("The specified path does not exist.")
    else:
        print("The 'PGDATA' environment variable is not set.")

delete_folder_contents()
```

The assignment expression `(pgdata_path := os.environ.get("PGDATA", None))` assigns the value of `os.environ.get("PGDATA", None)` to `pgdata_path` and simultaneously checks if it is not `None`. This allows you to combine the assignment and the `if` statement in a single line, removing one level of indentation.
### 2. For Loops

The walrus operator can also be used in for loops. Consider the following example where we want to create a list of squares of numbers in the input list if the squares are greater than 100:

```python
def fibonacci(n):
    if 0 <= n < 2:
        return n
    elif n < 0:
        raise ValueError("Negative Fibonnaci not supported")
    else:
        fib_seq = (0, 1)    
        for i in range(n - 1):
            (fib_seq := (fib_seq[1], sum(fib_seq)))    
    return fib_seq[1]

n = 10
fib_sequence = fibonacci(n)
print(f"The Fibonacci sequence in the position {n} is: {fib_sequence}")
```

Output:
```
The Fibonacci sequence in the position 10 is: 55
```

In this example, the walrus operator `(fib_seq := (fib_seq[1], sum(fib_seq)))` sets the values of the tuple (moves the second item in first position and places the sum of the existing values in the second position) and assigns that tuple to the variable `fib_seq `

### 3. List Comprehension

The walrus operator can also be used in list comprehensions to simplify the code. Consider the following example where we want to create a new list of squares of numbers from the input list of prime numbers if the squares are greater than 100:

```python
prime_list = [2, 3, 5, 7, 11]
applicable_list = [psqrd for prime in prime_list if (psqrd := prime ** 2) >= 100]
print("The original list is:", prime_list)
print("The output list is:", applicable_list)
```

Output:
```
The original list is: [2, 3, 5, 7, 11]
The output list is: [121]
```

In this example, the walrus operator `(psqrd := prime ** 2)` calculates the square of each number in the input list and assigns it to the variable `psqrd`. If the square is greater than or equal to 100, it is added to the `applicable_list` [[1]](https://www.codeconquest.com/blog/python-walrus-operator-uses-and-controversy/).

### 4. While Loops

The walrus operator can also be used in while loops. Consider the following example where we want to read input from a user until they enter the flag `\q`'. One way of doing it would be:

```python
data = []
while True:
    d = input('Please provide the required data: ')
    if d == '\q':
        break
    data.append(d)
print(f'Data passed is: {data}')
```

Output:

```
Please provide the required data: 1
Please provide the required data: 2
Please provide the required data: 3
Please provide the required data: \q
Data passed is: ['1', '2', '3']
```

We can modify this example to use the walrus operator to simplify the loop by creating the variable passed to `input` as well as check its value:

```python
data = []
while (d := input('Please provide the required data: ')) != '\q':
    data.append(d)
print(f'Data passed is: {data}')
```

Output:
```
Please provide the required data: 1
Please provide the required data: 2
Please provide the required data: 3
Please provide the required data: \q
Data passed is: ['1', '2', '3']
```



## Controversy Surrounding the Walrus Operator

Like any new feature, the walrus operator has sparked some controversy within the Python community. Some developers argue that it violates certain heuristics and can lead to less readable code [[2]](https://realpython.com/python-walrus-operator/). However, others find it to be a powerful addition that simplifies certain programming tasks.

## Conclusion

The walrus operator might just be a valuable addition to Python's syntax, providing a concise and efficient way to assign and evaluate expressions. While it may be a subject of controversy, it offers developers new possibilities for writing clean and efficient code.

---
# Resources

1. [Python Walrus Operator Uses and Controversy - Code Conquest](https://www.codeconquest.com/blog/python-walrus-operator-uses-and-controversy/)
2. [The Walrus Operator: Python 3.8 Assignment Expressions - Real Python](https://realpython.com/python-walrus-operator/)
3. [The Walrus Operator (:=) in Python | by Gajanan Rajput | Medium](https://medium.com/@rajputgajanan50/the-walrus-operator-in-python-90532f6ccd8a)
3. [PEP 572 – Assignment Expressions](https://peps.python.org/pep-0572/)