Danny Brown

A Blog on Code and Occasionally Other Things

Prepping for the Python MTA Certification (Exam 98-381): Control Flow with Decisions and Loops

Danny BrownSeptember 23, 2019

Part 1 – Part 2 –  Part 3 – Part 4 – Part 5 – Part 6 – Part 7

I plan to get my Microsoft Technology Associate certificate in Python programming and figured I’d take my notes publicly as I prepare. Call it learning in public or review notes or whatever – I’m just interested in passing on my first attempt. 

My aim is to review the topics I already know and cover topics I might have missed. I will link resources as opportunities arise. There will be lots of code examples provided, if for no other reason than to prove to myself that things work the way I expect.

I’m certainly interested in corrections if I have something blatantly wrong. However, the point of these posts isn’t to go super deep on each topic or act as a tutorial, but rather to act as a broad overview review of the topics (with perhaps some deeper dives where necessary) for this exam. I think it’s safe to say that if you don’t understand the code examples I provide here, you should review the corresponding topic in the Python documentation and other deep-dive tutorials.

Today I’m reviewing the following topics identified by Microsoft as being on the Python MTA exam:

The good news is that I’m comfortable with all of these keywords and how they’re used.

Construct and analyze code segments that use branching statements

if, elif, and else

These are the basic decision-makers of computer programming: do one thing if something is true, else do another thing if (elif) some other thing is true, add any number of elif statements as you want, and then if none of those if or elif statements were true, use the else as a catch-all. Both elif and else statements are optional.

num = 5
if num < 5: 
    print("Number is less than five!") 
elif num > 5:
    print("Number is greater than five!")
else:
    print("Number is five!")

Nested and compound conditional expressions

We can combine these statements along with operators previously discussed to do some more complex operations. Here is an example of nested statements I borrowed from this article on the subject:

num = float(input("Enter a number: "))
if num >= 0:
    if num == 0:
        print("Zero")
    else:
        print("Positive number")
else:
    print("Negative number")

This could have been done with an if/elif/else pattern in fewer lines of code, yes, but I borrowed it because I was struggling to come up with a simple but logical example myself, so I can hardly point fingers for questionable code snippets.

A compound conditional can include several checks in a single conditional statement:

if dollars > 50 and (status == "payday" or status == "birthday"):
    print("Treat yo'self!")

These are pretty basic topics that doubtless will be placed into highly complex chains of conditional expressions, I’m guessing asking me to predict the output. It seems doable.

Construct and analyze code segments that perform iteration

while

A while loop checks for a condition and executes until that condition is no longer true. This loop will continue to ask the user for a word until the user enters exactly “word”:

word = "sword"
while word != "word":
    word = input("enter a word: ")

while loops are also useful for performing a task a certain number of times and keeping a count (albeit this is often better executed with a for loop, covered next). This loop prints the integers 1 through 5, one per line:

count = 0
while count < 5:
    count += 1
    print(count)

output
1
2
3
4
5

for

for loops are a great way to iterate through a collection and are dead simple to use compared to other programming languages.

fruits = ["apple", "banana", "cherry", "dragonfruit", "elderberry"]
for fruit in fruits:
    print(fruit, end=" ")

output
apple banana cherry dragonfruit elderberry 

That’s incredibly cool and easy.

What if one needed to iterate through a list of numbers? The range function is super useful here. Like with slicing operations, the first specified number is inclusive, but the second specified number is not included:

for num in range(1,6):
    print(num, end=" ")

output
1 2 3 4 5 

Sometimes one might need to have access to both the index of the item and the item itself. This is easy to do with the enumerate function:

fruits = ["apple", "banana", "cherry", "dragonfruit", "elderberry"]
for index, fruit in enumerate(fruits):
    print(f"{index+1}. {fruit.title()}")

output
1. Apple
2. Banana
3. Cherry
4. Dragonfruit
5. Elderberry

How about iterating through two different lists of the same size? for loops have it handled with the zip function:

fruits = ["apple", "banana", "cherry", "dragonfruit", "elderberry"]
veggies = ["avocado", "beets", "cucumbers", "daikon", "eggplants"]
for fruit, veggie in zip(fruits, veggies):
    print(f"{veggie.title()} vs. {fruit.title()}")

output
Avocado vs. Apple
Beets vs. Banana
Cucumbers vs. Cherry
Daikon vs. Dragonfruit
Eggplants vs. Elderberry

Finally, for loops can be used to iterate through the keys and values of a dictionary:

disney_villains = {
    "Aladdin" : "Jafar", 
    "Hercules" : "Hades", 
    "The Little Mermaid" : "Ursula", 
    "The Lion King" : "Scar"
}
for movie, villain in disney_villains.items():
    print(f"{movie}: {villain}")

output
Aladdin: Jafar
Hercules: Hades
The Little Mermaid: Ursula
The Lion King: Scar

We can similarly loop through just the keys using the .keys() method:

for key in disney_villains.keys():
    print(key, end=" ")

output
Aladdin Hercules The Little Mermaid The Lion King

Or through just the values using the .values() method:

for value in disney_villains.values():
    print(value, end=" ")

output
Jafar Hades Ursula Scar 

Remember that dictionaries are unordered, so if order matters in these iterations through dictionaries, you’ll probably want to convert first to an ordered dictionary, which can be done by using a built-in module in Python (but Microsoft doesn’t mention it so it doesn’t seem worth getting into here!).

break

The break keyword stops the execution of the current for or while loop and is virtually always used in combination with a conditional statement (docs mention a few edge cases).

We’re going to return here to the while loop and a frequent design pattern that combines it with the break keyword. This code will keep prompting the user until the proper response is given:

while True:
    response = input("Hello there\n")
    if response == "General Kenobi":
        break

output
Hello there 
hey
Hello there 
hi
Hello there 
hello?
Hello there 
General Kenobi
>>> 

continue

I use the continue keyword on a fairly regular basis, but I’m not sure I’ve ever looked at the docs for it. Before I do, I’ll describe what I think it does: when you’re in a for loop, you might encounter a condition that wants you to stop that particular iteration of the loop but not actually break the loop. Using continue pushes you directly to the next item of the for loop.

The docs show I have this pretty much spot on, except it can also be used in while loops. Good to know!

The following program defines all the reasons one particular character hates sand, then continually loops and asks the user to recount them. It continues to loop until the user has recounted all the reasons one might hate sand. Note that the line printing “That’s all the reasons!” doesn’t execute until the conditional with the continue statement fails.

reasons_to_hate_sand = [
        "it's rough",
        "it's coarse",
        "it's irritating",
        "it gets everywhere"
]
reasons_given = []
while True:
    reason = input("What is a reason one might hate sand?\n")
    if reason in reasons_to_hate_sand:
        reasons_given.append(reason)
        if reasons_to_hate_sand != reasons_given:
            continue
        print("That's all the reasons!")
        break
    else:
        print("Nope, not a good enough reason. Try again.")

output
What is a reason one might hate sand?
it's rough
What is a reason one might hate sand?
it's coarse
What is a reason one might hate sand?
it's irritating
What is a reason one might hate sand?
it's sandy
Nope, not a good enough reason. Try again.
What is a reason one might hate sand?
it gets everywhere
That's all the reasons!
>>> 

pass

I use the pass keyword in two distinct places in my code:

1) As a placeholder in an indented segment so that I can save or execute in-progress code without an error:

def working_function():
    print("I am working here!")
def function_to_do():
    pass

2) In a try/except clause (to be covered in a later post in this prep series) where I don’t really have anything I want to do to handle an error except skip it and keep going. Note that this example is pretty simple and not really good practice for a number of reasons:

try:
    age = int(input("What's your age?\n"))
    # let's pretend that it doesn't really matter if we get this or not!
    print(age)
except:
    pass

output
What's your age?
900
900

What's your age?
when nine-hundred years old you reach, look as good you will not 

Note that there is no output in the second example, but that no error is thrown either.

nested loops and loops that include compound conditional expressions

A really common design pattern is nested for loops.  These are often useful for iterating through items in a list of lists.

characters = [
    ["Luke", "Leia", "Han"],
    ["Vader", "Tarkin", "Palpatine"],
    ["Fett", "Hutt", "Yoda"]
]
for group in characters:
    for character in group:
        print(character)

output
Luke
Leia
Han
Vader
Tarkin
Palpatine
Fett
Hutt
Yoda

We’ve covered compound conditional expressions and all kinds of loop strategies, but let’s see if we can close this post out with a nice example combining these:

trilogy_characters = {
    "Original Trilogy" : ["Luke", "Leia", "Han", "Vader", "Yoda"],
    "Prequels" : ["Anakin", "Padme", "Qui-Gon", "Obi-Wan", "Jar-Jar"],
    "Sequels" : ["Rey", "Finn", "Poe", "BB-8", "Rose"]
}
like_counts = trilogy_characters.copy()

for trilogy, characters in trilogy_characters.items():
    liked_characters = 0
    for character in characters:
        response = int(input(
            f'Enter "1" if you like this character or "2" if not.\n'
            f'{character}: '
        ))
        if response is 1:
            liked_characters += 1
        elif response is 2:
            print(f"What?! Who doesn't like the great {character.upper()}?")
    like_counts[trilogy] = liked_characters

print("Here are the number of characters you like from each trilogy:")
for trilogy, count in like_counts.items():
    print(f"{trilogy}: {count}")
print(f"You clearly like the {max(like_counts, key=like_counts.get)} best!")

output
Enter "1" if you like this character or "2" if not.
Luke: 1
Enter "1" if you like this character or "2" if not.
Leia: 1
Enter "1" if you like this character or "2" if not.
Han: 1
Enter "1" if you like this character or "2" if not.
Vader: 1
Enter "1" if you like this character or "2" if not.
Yoda: 1
Enter "1" if you like this character or "2" if not.
Anakin: 1
Enter "1" if you like this character or "2" if not.
Padme: 1
Enter "1" if you like this character or "2" if not.
Qui-Gon: 1
Enter "1" if you like this character or "2" if not.
Obi-Wan: 1
Enter "1" if you like this character or "2" if not.
Jar-Jar: 2
What?! Who doesn't like the great JAR-JAR?
Enter "1" if you like this character or "2" if not.
Rey: 1
Enter "1" if you like this character or "2" if not.
Finn: 1
Enter "1" if you like this character or "2" if not.
Poe: 1
Enter "1" if you like this character or "2" if not.
BB-8: 1
Enter "1" if you like this character or "2" if not.
Rose: 2
What?! Who doesn't like the great ROSE?
Here are the number of characters you like from each trilogy:
Original Trilogy: 5
Prequels: 4
Sequels: 4
You clearly like the Original Trilogy best!

There aren’t any compound conditional expressions in there now that I look at it, but I think this is fine for off the cuff.

Part three is coming soon. The topic: performing input and output operations.

Posted In code | Python
Tagged Exam 98-381 | learning in public | Microsoft Technology Associate certification

Post navigation

PreviousPrepping for the Python MTA Certification (Exam 98-381): Data Types and Operators
NextPrepping for the Python MTA Certification (Exam 98-381): Input and Output Operations

Danny Brown

A Dev Blog with Some Tangents

About

Categories

  • code
    • APIs
    • Bash
    • CSS
    • Django
    • HTML
    • JavaScript
    • Python
    • S3
    • Selenium
    • Serverless
    • TypeScript
  • games
  • music
    • concert reviews
    • synthesizers
  • opinion
  • sports
  • tech
    • Bitbucket
    • Git
    • GitHub
    • MS Teams
    • WordPress
  • theater

Recent Posts

  • Open Pull Requests from the Terminal (One of My Favorite Dotfiles Scripts)
  • Dotfiles Script for a New TypeScript/Node Project
  • So I Told You to Go See a Broadway Play? Tips for Theater in New York
  • Build a Simple Microsoft Teams Bot Easily, No SDK Required
  • Creating a GUI for Conway’s Game of Life Using Pygame and Numpy

External Links

  • GitHub
  • LinkedIn

Recent Posts

  • Open Pull Requests from the Terminal (One of My Favorite Dotfiles Scripts)
  • Dotfiles Script for a New TypeScript/Node Project
  • So I Told You to Go See a Broadway Play? Tips for Theater in New York
  • Build a Simple Microsoft Teams Bot Easily, No SDK Required
  • Creating a GUI for Conway’s Game of Life Using Pygame and Numpy

Categories

  • code
    • APIs
    • Bash
    • CSS
    • Django
    • HTML
    • JavaScript
    • Python
    • S3
    • Selenium
    • Serverless
    • TypeScript
  • games
  • music
    • concert reviews
    • synthesizers
  • opinion
  • sports
  • tech
    • Bitbucket
    • Git
    • GitHub
    • MS Teams
    • WordPress
  • theater
Copyright © 2025. Danny Brown
Powered By WordPress and Meritorious