Conditions (if and match)#

Education objectives

  • notion of block

  • block if, keywords elif, else and match

  • keywords pass and built-in constant ... is Ellipsis

  • again isinstance()… and notion of duck typing

if, elif, else syntax#

if condition:
   # code to execute when condition evals to True
   ...
else:
   # code to execute when condition evals to False
   ...
a = 0
if a == 0:
    print("a is equal to 0.")

    print("another statement in the block")

print("a statement outside the block")
a is equal to 0.
another statement in the block
a statement outside the block

And when the condition is not met:

a = 1
if a == 0:
    print("a is equal to 0.")

    print("another statement in the block")

print("a statement outside the block")
a statement outside the block
a = 1
if a < 0:
    print("a is negative.")
elif a == 0:
    print("a is equal to 0.")
elif a > 0:
    print("a is positive.")
else:
    print("I don't know.")
a is positive.

match keyword#

If many elif has to be made, python proposes (since version 3.10) a more lisible and powerful construction using the match keyword:

User input and the input built-in function

One of the most simpler way to get an input from a user is to use the input built-in function.

answer = input("hello, say y(es)/n(o)/m(ay be)")

Note that inputs can come from many different ways in a program, for example, GUI widgets, databases or files. Actually, in many cases, parameter files are more convenient that the input function.

In this notebook, we cannot use the real input function since there is no user to answer. But in Python, we can locally replace a built-in function by our own function. We just need to define a local function with the same name. We do it in a hidden cell since this is not the subject of this notebook and that defining functions will be seen later.

Hide code cell content

def input(prompt):
    """A silly and positive replacement for the input function

    Don't act like that in real life.
    """
    print(prompt, end="")
    return "y"

Now we can use our local input function that always return "y"

answer = input("hello, say y(es)/n(o)/m(ay be)")
hello, say y(es)/n(o)/m(ay be)

and finally see how we can process the answer:

match answer:
    case "y" | "yes":
        print('process "yes" answer')
    case "n" | "no":
        print('process "no" answer')
    case "m" | "may be":
        print('process the "may be" answer')
    case _:
        print("not a valid answer.")
process "yes" answer

We see that the match statement allows one to express conditions on answer in a concise and elegant way. Actually “Structural Pattern Matching” (the match statement) is extremely powerful. One can read the short documentation for the match statement but there is even a long PEP with a detailed tutorial on this relatively recent feature (introduced in Python 3.10): PEP 636 – Structural Pattern Matching: Tutorial.

The pass keyword, and Ellipsis (a.k.a …)#

The pass instruction is the empty instruction. The typical usage is the following:

if cond:
    # some code
else:
    pass

Your are testing the some code block and know the else block will come but is not yet written. You nevertheless want to have a syntactically correct code. Similarly, you can write

if cond:
    # some code
else:
    ...