# Control flow

Up until this point, we've been using Python in quite a **verbose** way,
often repeating the same lines of code with different inputs to get slightly
different outputs.

For example, in Session 2's section on [Readable Code](../session_2/readable_code.qmd)
we created the following piece of code which calculates the pressure
of an ideal gas at different volumes.

```python
from scipy import constants

# Number of moles
n = 2

# Temperature in K
T = 298 

# Volumes in m^3
volumes = [10, 20, 30, 40, 50]

# Empty list of pressures
pressures = []

# Calculate pressure (Pa) at each temperature
# Using the ideal gas equation
pressures.append(n * constants.R * T / volumes[0])
pressures.append(n * constants.R * T / volumes[1])
pressures.append(n * constants.R * T / volumes[2])
pressures.append(n * constants.R * T / volumes[3])
pressures.append(n * constants.R * T / volumes[4])
```

Notice that the last five lines repeat what is essentially the same calculation.
From Session 3, we know that each of these should be replaced by
a call to a function, but this would still leave us with five lines of function
calls. A better approach would be to somehow tell Python to repeat this command
for many, slightly different, inputs.

In today's Session, we'll see how we can use **control flow** statements to express
*repetition* and *decision-making* clearly and safely.