De um laço a uma só expressão
Um laço muito comum começa com uma lista vazia e acrescenta um resultado por item. Uma list comprehension diz a mesma coisa em uma expressão, entre colchetes: [o_que_construir for item in coleção]. Leia da esquerda para a direita: «construa isto, para cada item daquilo». É mais curta e mostra de relance que o todo é uma nova lista.
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]Manter só alguns itens: if
Acrescente if condition no fim para manter só os itens que passam em um teste. É assim que se filtra: retornos positivos, ordens acima de um tamanho, símbolos que combinam. Os itens que falham simplesmente ficam de fora, e a ordem dos demais é mantida.
# 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]Posições e pares
A parte for funciona como um laço normal: pode percorrer range(...) para usar posições e nomear as duas metades de um par (for symbol, price in quotes). Use posições quando cada resultado depende de um vizinho, como um retorno a partir do preço anterior; use pares quando cada item tem vários campos.
# 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 vai na frente
Um if no final remove itens. Se você quer mudar cada item conforme uma condição, use a expressão condicional a if condition else b como primeira parte. Misturar os dois é um erro comum: if sozinho vai depois do for, if ... else vai antes.
# 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 normal. Se uma comprehension ficar longa ou aninhada, divida-a em um laço ou em uma função auxiliar: legibilidade vale mais que esperteza.[expression for item in items]: um resultado por item.... if conditionno fim: manter só alguns itens.a if condition else bno início: mudar cada item.
A seguir: listas, a coleção sobre a qual esses laços e comprehensions vêm trabalhando: indexação, fatiamento, adição, remoção e ordenação.
Lab: o que é avaliado
- Avaliar cada operação em uma expressão com
notionals25 pts - Transformar preços em retornos com
simple_returns25 pts - Manter só os ganhos com
positive_returns25 pts - Filtrar e limpar símbolos ao mesmo tempo com
symbols_above25 pts