Session 11: Loops#
Introduction#
In previous workshops, we’ve briefly encountered for loops, which we used to perform operations on each element of a list. In this session, we’ll extend our understanding of loops by introducing the range() function, which allows us to execute code a specific number of times. We’ll also explore while loops, which repeat a block of code as long as a condition remains true. Finally, we’ll look at how to control the flow of loops using break and continue statements.
Loops are essential in programming because they enable us to automate repetitive tasks, making our code more efficient and concise. In chemistry, loops can be used to simulate processes, analyze data, and perform calculations repeatedly under different conditions.
Part 1: for Loops with range()#
Task 1#
Open a new Jupyter Notebook in your
Workshop_8directory.In a new cell, copy and run the following code:
print(range(5))
for i in range(5):
print(i)
Analysis#
In this task, we introduce the range() function combined with a for loop to execute code a specific number of times.
range(5)generates a sequence of numbers from0up to, but not including,5. So, it generates[0, 1, 2, 3, 4].for i in range(5):initiates a loop that will iterate over each number in the sequence produced byrange(5).
Task 2#
Let’s apply this concept to a chemistry-related problem.
Suppose we want to simulate the decay of a radioactive substance over time. For simplicity, we’ll assume a fixed decay rate.
Before running the code, predict what each line will do. Think about what type is each variable.
Copy and run the following code:
initial_amount = 100 # grams
decay_rate = 0.1 # 10% decay per time unit
time_steps = 5
amount = initial_amount
for t in range(time_steps):
amount = amount * (1 - decay_rate)
print(f"After {t+1} time unit(s), amount remaining: {amount} grams")
Analysis#
initial_amount = 100sets the starting amount of the substance.decay_rate = 0.1represents a 10% decay per time unit.time_steps = 5defines how many times we will apply the decay.amount = initial_amountinitializes the amount before the loop.for t in range(time_steps):will iterate 5 times (fromt = 0tot = 4).amount = amount * (1 - decay_rate)updates the amount by applying the decay rate.print(f"After {t+1} time unit(s), amount remaining: {amount} grams")outputs the amount remaining after each time unit.
Part 2: while Loops#
while loops are useful for situations when we do not know how many times we want to run a certain piece of code, but we do know in what conditions we want to stop. For example, this might be searching or analyzing a text file until we encounter a specific symbol (\n).
Task 3#
Now let’s explore while loops.
In a new cell, copy and run the following code:
count = 0
while count < 5:
print(count)
count += 1
Analysis#
count = 0initializes thecountvariable.while count < 5:creates a loop that will continue as long ascountis less than 5.print(count)outputs the current value ofcount.count += 1incrementscountby 1 in each iteration.
This loop will execute the code block repeatedly until the condition count < 5 is no longer true.
Task 4#
The previous example could have easily been written using a for loop (how?), but now let’s use a while loop to model a chemical reaction that continues until a reactant is depleted.
Suppose we have 50 grams of a reactant that decreases by 15% each time due to a side reaction.
Read and try to predict what the following code will do.
Copy and run the code:
reactant_amount = 50 # grams
threshold = 5 # grams
time = 0
while reactant_amount > threshold:
reactant_amount = reactant_amount * 0.85 # Decrease by 15%
time += 1
print(f"After {time} cycle(s), reactant amount: {reactant_amount:.2f} grams")
Analysis#
reactant_amount = 50initializes the amount of reactant.threshold = 5defines when we consider the reactant depleted.time = 0initializes the time counter.while reactant_amount > threshold:loop continues as long as the reactant amount is above the threshold.reactant_amount = reactant_amount * 0.85simulates the 15% decrease.time += 1increments the time counter.print(f"After {time} cycle(s), reactant amount: {reactant_amount:.2f} grams")outputs the amount after each cycle.
Part 3: Controlling Loops with break and continue#
Task 5#
Now we’ll see how to control the flow of loops using break and continue.
Copy and run the code:
for num in range(10):
if num == 5:
break
print(num)
Analysis#
for num in range(10):loops over numbers from 0 to 9.if num == 5:checks ifnumis equal to 5.breakexits the loop immediately whennumis 5.print(num)outputs the current number if the loop hasn’t been broken.
Task 6#
Let’s use continue in a loop.
Copy and run the code:
for num in range(10):
if num % 2 == 0:
continue
print(num)
Analysis#
for num in range(10):loops over numbers from 0 to 9.if num % 2 == 0:checks ifnumis even.continueskips the rest of the loop body and moves to the next iteration ifnumis even.print(num)outputs the number if it is not even.
Task 7#
Chemistry Application
Let’s apply break and continue to a chemistry problem.
Suppose we’re monitoring a reaction, and we want to stop the process if the concentration of a product exceeds a certain limit.
Read the following code and try to predict what it will do.
Copy and run the code:
concentration = 0.0
time_step = 0
while True:
concentration += 0.8 # Concentration increases by 0.8 M per time unit
time_step += 1
print(f"Time: {time_step}, Concentration: {concentration} M")
if concentration >= 5.0:
print("Concentration limit reached. Stopping the reaction.")
break
Analysis#
while True:creates an infinite loop.concentration += 0.8increases concentration by 0.8 M each time.time_step += 1increments the time step.print(f"Time: {time_step}, Concentration: {concentration} M")outputs the current time and concentration.if concentration >= 5.0:checks if concentration has reached or exceeded 5.0 M.print("Concentration limit reached. Stopping the reaction.")notifies that the limit has been reached.breakexits the loop.
Conclusion#
In this session, we’ve explored how loops can be used to execute code multiple times, either for a specific number of iterations or while a condition holds true. By using for loops with the range() function, we can repeat actions a set number of times, which is useful for simulations and repetitive calculations. The while loop allows us to continue processing as long as certain conditions are met, which is handy for monitoring ongoing processes in chemistry.
We also learned how to control the flow of loops using break and continue. The break statement allows us to exit a loop prematurely, which is useful when a certain condition necessitates stopping the process. The continue statement lets us skip the current iteration and move on to the next one, which is helpful when we need to ignore certain values or conditions.
Loops are powerful tools in programming that can help automate and simplify repetitive tasks in chemical computations and data analysis.
Feel free to experiment further by modifying the examples, such as changing the decay rates, thresholds, or lists of values, to see how the loops behave under different conditions.