要素ごとにブロックを繰り返す
for ループは、コレクションの要素ごとにインデントされたブロックを1回ずつ実行し、その回の要素に名前を付けます。ここでのコレクションは、角かっことカンマで書くリストです(リストはあとで独立したトピックになります)。構文は if と似ており、1行目の末尾にコロン、その下にインデントされたブロックを書きます。
prices = [184.25, 184.5, 184.0]
for price in prices:
print(price) # 184.25, then 184.5, then 184.0range:リストなしで数える
range(n) は 0 から n - 1 までの整数を作ります。終了値は含まれないので、range(5) の要素は5個です。range(start, stop) は指定した値から始まり、range(start, stop, step) は step ずつ進み、負にすればカウントダウンになります。何回か繰り返したいときや、位置を順にたどるときに使います。
# range counts, and stops before the stop value
print(list(range(5))) # [0, 1, 2, 3, 4]
print(list(range(2, 10, 3))) # [2, 5, 8]
print(list(range(3, 0, -1))) # [3, 2, 1]アキュムレータのパターン
多くのループは同じ型に従います。ループの前に変数を用意し、ループの中で更新し、ループの後で使います。total += price * quantity は total = total + price * quantity の省略形です。ここではリストの各要素がペアになっていて、ループの行で両方の名前を一度に付けています(この「アンパック」はあとのトピックでしっかり説明します)。
# Accumulate a total over the trades
trades = [(184.25, 200), (185.0, 100), (183.5, 50)]
total = 0.0
for price, quantity in trades:
total += price * quantity
print(total) # 64525.0位置をたどるループ
各要素を直前の要素と比べたいことがあります。range(1, len(prices)) で位置を順にたどりましょう。1から始まるので、prices[i - 1] は常に有効です。len() は要素数を返し、prices[i] は0から数えて i 番目の要素を取り出します。
# Compare each price with the one before it
prices = [184.0, 184.5, 184.25, 185.0]
ups = 0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]:
ups += 1
print(ups) # 2ループしながらリストを作る
1回ごとに結果を1つ集めるには、空のリスト [] から始め、ループの中で .append(value) を呼びます。価格のはしご、累計、日ごとのシグナルはどれもこうして作ります。リストはループが終わってから返す(または使う)ことになります。
# Build a list of prices, one per tick level
start, tick = 184.0, 0.25
ladder = []
for level in range(4):
ladder.append(start + level * tick)
print(ladder) # [184.0, 184.25, 184.5, 184.75]次は while ループ、break、continue です。決まった個数ではなく、条件が変わるまで繰り返します。
ラボ:採点される内容
total_notionalで複数の約定の金額を合計する25点price_ladderで価格の階段を作る25点count_up_daysで価格が上がった日を数える25点running_totalで累計を作る25点