\section{Control Structures}\label{control-structures}

Control structures allow us to control the flow of execution in a Python
program. The two main types are \textbf{conditional statements
(\texttt{if} statements)} and \textbf{loops (\texttt{for} and
\texttt{while} loops)}.

\subsection{Conditional Statements}\label{conditional-statements}

Conditional statements allow a program to execute different blocks of
code depending on whether a given condition is \texttt{True} or
\texttt{False}. These conditions are typically comparisons, such as
checking if one number is greater than another.

\subsubsection{\texorpdfstring{The \texttt{if}
Statement}{The if Statement}}\label{the-if-statement}

The simplest form of a conditional statement is the \texttt{if}
statement. If the condition evaluates to \texttt{True}, the indented
block of code runs. Otherwise, the program moves on without executing
the statement.

For example, consider a situation where we need to determine if a person
is an adult based on their age. If the age is 18 or greater, we print a
message saying they are an adult.

\subsubsection{\texorpdfstring{The \texttt{if-else}
Statement}{The if-else Statement}}\label{the-if-else-statement}

Sometimes, we need to specify what should happen if the condition is
\texttt{False}. The \texttt{else} clause allows us to handle this case.
Instead of just skipping over the block, the program can execute an
alternative action.

For instance, if a person is younger than 18, they are considered a
minor. If the condition of being an adult is not met, the program will
print a message indicating that the person is a minor.

\subsubsection{\texorpdfstring{The \texttt{if-elif-else}
Statement}{The if-elif-else Statement}}\label{the-if-elif-else-statement}

When dealing with multiple conditions, the \texttt{if-elif-else}
structure is useful. The program evaluates conditions in order,
executing the first one that is \texttt{True}. If none of the conditions
are met, the \texttt{else} block runs.

For example, in a grading system, different score ranges correspond to
different letter grades. If a student's score is 90 or higher, they
receive an ``A''. If it's between 80 and 89, they get a ``B'', and so
on. If none of the conditions match, they receive an ``F''.

\subsubsection{\texorpdfstring{Nested \texttt{if}
Statements}{Nested if Statements}}\label{nested-if-statements}

Sometimes, we need to check conditions within other conditions. This is
known as \textbf{nesting}. For example, if we first determine that a
person is an adult, we can then check if they are a student. Based on
that information, we print different messages.

\begin{Shaded}
\begin{Highlighting}[]
\CommentTok{\# Getting user input for the student\textquotesingle{}s score}
\NormalTok{score }\OperatorTok{=} \BuiltInTok{int}\NormalTok{(}\BuiltInTok{input}\NormalTok{(}\StringTok{"Enter the student\textquotesingle{}s score (0{-}100): "}\NormalTok{))}

\ControlFlowTok{if} \DecValTok{0} \OperatorTok{\textless{}=}\NormalTok{ score }\OperatorTok{\textless{}=} \DecValTok{100}\NormalTok{:}
    \ControlFlowTok{if}\NormalTok{ score }\OperatorTok{\textgreater{}=} \DecValTok{90}\NormalTok{:}
\NormalTok{        grade }\OperatorTok{=} \StringTok{"A"}
    \ControlFlowTok{elif}\NormalTok{ score }\OperatorTok{\textgreater{}=} \DecValTok{80}\NormalTok{:}
\NormalTok{        grade }\OperatorTok{=} \StringTok{"B"}
    \ControlFlowTok{elif}\NormalTok{ score }\OperatorTok{\textgreater{}=} \DecValTok{70}\NormalTok{:}
\NormalTok{        grade }\OperatorTok{=} \StringTok{"C"}
    \ControlFlowTok{elif}\NormalTok{ score }\OperatorTok{\textgreater{}=} \DecValTok{60}\NormalTok{:}
\NormalTok{        grade }\OperatorTok{=} \StringTok{"D"}
    \ControlFlowTok{else}\NormalTok{:}
\NormalTok{        grade }\OperatorTok{=} \StringTok{"F"}  \CommentTok{\# Score below 60 is a failing grade}


    \ControlFlowTok{if}\NormalTok{ grade }\OperatorTok{==} \StringTok{"F"}\NormalTok{:}
        \BuiltInTok{print}\NormalTok{(}\StringTok{"The student has failed."}\NormalTok{)}
\NormalTok{        retake\_eligible }\OperatorTok{=} \BuiltInTok{input}\NormalTok{(}\StringTok{"Is the student eligible for a retest? (yes/no): "}\NormalTok{).strip().lower()}
        
        \ControlFlowTok{if}\NormalTok{ retake\_eligible }\OperatorTok{==} \StringTok{"yes"}\NormalTok{:}
            \BuiltInTok{print}\NormalTok{(}\StringTok{"The student is eligible for a retest."}\NormalTok{)}
        \ControlFlowTok{else}\NormalTok{:}
            \BuiltInTok{print}\NormalTok{(}\StringTok{"The student has failed the course and must retake it next semester."}\NormalTok{)}

    
\end{Highlighting}
\end{Shaded}

\subsection{Loops in Python}\label{loops-in-python}

Loops allow a program to execute a block of code multiple times. This is
especially useful for tasks such as processing lists of data, performing
repetitive calculations, or automating tasks.

\subsubsection{\texorpdfstring{The \texttt{for}
Loop}{The for Loop}}\label{the-for-loop}

A \texttt{for} loop iterates over a sequence, such as a list, tuple,
string, or a range of numbers. Each iteration assigns the next value in
the sequence to a loop variable, which can then be used inside the loop.

For instance, if we have a list of fruits and want to print each fruit's
name, a \texttt{for} loop can iterate over the list and display each
item.

Another useful feature of \texttt{for} loops is the \texttt{range()}
function, which generates a sequence of numbers. This is commonly used
when we need to repeat an action a specific number of times. For
example, iterating from 0 to 4 allows us to print a message five times.

Additionally, the \texttt{enumerate()} function can be used to loop
through a list while keeping track of the index of each item. This is
useful when both the position and the value in a sequence are needed.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{fruits }\OperatorTok{=}\NormalTok{ [}\StringTok{"apple"}\NormalTok{, }\StringTok{"banana"}\NormalTok{, }\StringTok{"cherry"}\NormalTok{]  }
\ControlFlowTok{for}\NormalTok{ x }\KeywordTok{in}\NormalTok{ fruits:  }
  \BuiltInTok{print}\NormalTok{(x)}
\end{Highlighting}
\end{Shaded}

\begin{Shaded}
\begin{Highlighting}[]
\ControlFlowTok{for}\NormalTok{ x }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(}\DecValTok{6}\NormalTok{):  }
  \BuiltInTok{print}\NormalTok{(x)  }
\ControlFlowTok{else}\NormalTok{:  }
  \BuiltInTok{print}\NormalTok{(}\StringTok{"Finally finished!"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\subsubsection{\texorpdfstring{The \texttt{while}
Loop}{The while Loop}}\label{the-while-loop}

Unlike \texttt{for} loops, which iterate over a sequence, \texttt{while}
loops continue running as long as a specified condition remains
\texttt{True}. This is useful when the number of iterations is not known
in advance.

For example, a countdown timer can be implemented using a \texttt{while}
loop. The loop will continue decreasing the count until it reaches zero.

It's important to be careful with \texttt{while} loops to avoid infinite
loops, which occur when the condition never becomes \texttt{False}. To
prevent this, ensure that the condition will eventually change during
the execution of the loop.

A \texttt{while} loop can also be used to wait for a certain event to
occur. For example, in interactive programs, a \texttt{while\ True} loop
can keep running until the user provides a valid input, at which point
we break out of the loop.

\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{i }\OperatorTok{=} \DecValTok{1}  
\ControlFlowTok{while}\NormalTok{ i }\OperatorTok{\textless{}} \DecValTok{6}\NormalTok{:  }
\NormalTok{  print(i)  }
\NormalTok{  i }\OperatorTok{+=} \DecValTok{1}
\end{Highlighting}
\end{Shaded}

\subsection{Loop Control Statements}\label{loop-control-statements}

Python provides special statements to control the behavior of loops.
These can be used to break out of a loop, skip certain iterations, or
simply include a placeholder for future code.

\subsubsection{\texorpdfstring{The \texttt{break}
Statement}{The break Statement}}\label{the-break-statement}

The \texttt{break} statement is used to exit a loop before it has
iterated through all its elements. When the \texttt{break} statement is
encountered, the loop stops immediately, and the program continues
executing the next statement outside the loop.

For instance, if we are searching for a specific value in a list, we can
use a \texttt{break} statement to stop the loop as soon as we find the
item, instead of continuing unnecessary iterations.

\subsubsection{\texorpdfstring{The \texttt{continue}
Statement}{The continue Statement}}\label{the-continue-statement}

The \texttt{continue} statement is used to skip the current iteration
and proceed to the next one. Instead of exiting the loop entirely, it
simply moves on to the next cycle.

For example, if we are iterating over numbers and want to skip
processing number 2, we can use \texttt{continue}. The loop will ignore
that iteration and proceed with the next number.

\subsubsection{\texorpdfstring{The \texttt{pass}
Statement}{The pass Statement}}\label{the-pass-statement}

The \texttt{pass} statement is a placeholder that does nothing. It is
useful when a block of code is syntactically required but no action
needs to be performed yet.

For example, in a loop where a condition has not yet been implemented,
using \texttt{pass} ensures that the code remains valid while avoiding
errors.
