Université de Genève · CUI BSc · Algorithmique & Structures de données
Python Basics I: Control Structures
Séminaire 2
1 / 11
Today's Agenda
- Truthiness — Python's approach to True / False
- Branching & looping: if / for / while
- Why complexity matters — a preamble
- Big O notation in Python
- List comprehensions — concise & fast
2 / 11
Truthiness in Python
Python considère certaines valeurs comme False en contexte booléen — on les appelle falsy.
# Falsy values
bool(0) # False
bool(0.0) # False
bool('') # False — empty string
bool([]) # False — empty list
bool({}) # False — empty dict
bool(None) # False
Tout le reste est truthy (nombres non nuls, conteneurs non vides, objets).
# Pythonic checks
if not items: # ✓ check for empty list
if items == []: # ✗ avoid — creates a new list
if x is None: # ✓ identity check
if x == None: # ✗ avoid — uses __eq__
if 0 < x < 100: # ✓ chained comparison
Pitfall: les arguments par défaut mutables interagissent mal avec les tests d'évaluation booléenne.
3 / 11
Branching & Looping
if / elif / else — choisir une voie selon des conditions :
score = 78
if score >= 90:
grade = 'A'
elif score >= 75:
grade = 'B'
else:
grade = 'F'
for — itérer sur n'importe quelle séquence (range, list, dict, …) :
for i, name in enumerate(['Alice', 'Bob']):
print(i, name) # 0 Alice, 1 Bob
while — répéter jusqu'à ce qu'une condition change ; utiliser break / continue pour le contrôle :
while True:
val = input('Enter a positive number: ')
if val == "stop":
break
elif not val.isdigit():
print("only int allowed")
else:
print(f"you entered {val}")
4 / 11
List Comprehensions — From Loop to One-liner
| Pattern | Traditional for-loop | List comprehension |
| Basic transform | squares = []
for x in range(10):
squares.append(x**2) | squares = [x**2 for x in range(10)] |
| With filter | evens = []
for x in range(20):
if x % 2 == 0:
evens.append(x) | evens = [x for x in range(20) if x % 2 == 0] |
| Nested (⚠ O(n²)) | pairs = []
for x in range(3):
for y in range(3):
pairs.append((x,y)) | pairs = [(x,y) for x in range(3)
for y in range(3)] |
5 / 11
Preamble: Why Does Complexity Matter?
- Tout algorithme consomme des ressources : temps et mémoire
- Lorsque la taille des entrées augmente, un code mal adapté à la montée en charge rencontre des limites réelles
- Une solution par force brute peut fonctionner pour 100 éléments mais échouer pour 1 000 000
- notation grand O — O(…) — décrit comment l'utilisation des ressources croît avec la taille de l'entrée n
- Two key dimensions:
- Complexité temporelle — combien d'étapes / opérations
- Complexité spatiale — combien de mémoire est utilisée
- Objectif : choisir des algorithmes qui évoluent bien en fonction du problème
- Nous formaliserons cela dans le Séminaire 6 — ceci est votre introduction
6 / 11
Big O Notation in Python
Introduction pour le Séminaire 6 — chaque courbe montre un motif courant en Python et son taux de croissance.
7 / 11
Why Big O Matters
À n = 5000 la boucle imbriquée prend 0,9 s tandis que la boucle simple s'achève en 0,0002 s — soit un facteur 4500×, et la différence ne fait qu'empirer lorsque n augmente.
8 / 11
Today's Exercises
- Ex 1 — find_max(a,b,c) utilisant if/elif/else
- Ex 2 — FizzBuzz (question d'entretien classique)
- Ex 3 — Vérificateur d'année bissextile
- Ex 4 — Boucle de calculatrice : continuer à demander jusqu'à 'quit'
- Ex 5 — Afficher la table de multiplication pour n
9 / 11
Key Takeaways
- La notion de truthiness en Python : utiliser if not items, if x is None
- if / for / while couvrent tous les flux de contrôle dont vous avez besoin
- Privilégiez enumerate() plutôt que range(len(...))
- La notation grand O indique comment le code évolue — la différence entre O(n) et O(n²) est cruciale
- Les List comprehensions sont plus rapides et plus lisibles que les boucles
- Réfléchissez toujours : combien de fois cette boucle s'exécute-t-elle ?
10 / 11
Université de Genève · CUI BSc · Algorithmique & Structures de données
Thank You & Have Fun!
11 / 11