D'une boucle à une seule expression
Une boucle très courante part d'une liste vide et ajoute un résultat par élément. Une compréhension de liste dit la même chose en une seule expression, entre crochets : [ce_qu'on_construit for item in collection]. Lisez-la de gauche à droite : « construire ceci, pour chaque élément de cela ». C'est plus court, et l'on voit d'un coup d'œil que le tout est une nouvelle liste.
prices = [184.0, 185.0, 183.0]
# The loop way
notionals = []
for price in prices:
notionals.append(price * 100)
print(notionals) # [18400.0, 18500.0, 18300.0]
# The comprehension way: the same list in one line
notionals = [price * 100 for price in prices]
print(notionals) # [18400.0, 18500.0, 18300.0]Garder seulement certains éléments : if
Ajoutez if condition à la fin pour ne garder que les éléments qui réussissent un test. C'est ainsi que l'on filtre : rendements positifs, ordres au-dessus d'une taille, symboles qui correspondent. Les éléments qui échouent sont simplement omis, et l'ordre des autres est conservé.
# Keep only the items that pass a test
returns = [0.01, -0.02, 0.005, -0.001, 0.03]
gains = [r for r in returns if r > 0]
print(gains) # [0.01, 0.005, 0.03]Positions et paires
La partie for fonctionne comme une boucle ordinaire : elle peut parcourir range(...) pour utiliser des positions, et nommer les deux moitiés d'une paire (for symbol, price in quotes). Utilisez les positions quand chaque résultat dépend d'un voisin, comme un rendement à partir du prix précédent ; utilisez les paires quand chaque élément contient plusieurs champs.
# Simple returns from a price series, using positions
prices = [100.0, 102.0, 101.0]
returns = [prices[i] / prices[i - 1] - 1 for i in range(1, len(prices))]
print([round(r, 4) for r in returns]) # [0.02, -0.0098]
# Pairs can be unpacked, and the result can be transformed
quotes = [("aapl", 184.5), ("msft", 410.2), ("goog", 171.0)]
above = [symbol.upper() for symbol, price in quotes if price > 180]
print(above) # ['AAPL', 'MSFT']if/else se place devant
Un if final retire des éléments. Si vous voulez modifier chaque élément selon une condition, utilisez l'expression conditionnelle a if condition else b comme première partie. Confondre les deux est une erreur courante : if seul va après le for, if ... else va avant.
# if/else changes each item; a plain if (at the end) drops items
returns = [0.01, -0.02, 0.005, -0.001, 0.03]
signals = ["long" if r > 0 else "flat" for r in returns]
print(signals) # ['long', 'flat', 'long', 'flat', 'long']for ordinaire. Si une compréhension devient longue ou imbriquée, découpez-la en boucle ou en fonction auxiliaire : la lisibilité vaut mieux que l'astuce.[expression for item in items]: un résultat par élément.... if conditionà la fin : ne garder que certains éléments.a if condition else bau début : modifier chaque élément.
À suivre : les listes, la collection sur laquelle ces boucles et compréhensions travaillent : indexation, découpage, ajout, suppression et tri.
Lab : ce qui est noté
- Valoriser chaque transaction en une expression avec
notionals25 pts - Transformer des prix en rendements avec
simple_returns25 pts - Ne garder que les gains avec
positive_returns25 pts - Filtrer et nettoyer des symboles en même temps avec
symbols_above25 pts