実行するコードを選ぶ
ここまでは、すべての行が上から下へ実行されてきました。if 文は、条件が True のときだけコードのブロックを実行します。さらに条件を足すには elif(「そうでなくて〜なら」)、残りすべてには else を使います。Pythonは順番に確認し、条件が真になった最初のブロックだけを実行します。条件の行はコロンで終わります。
position, target = 100, 250
if target > position:
print("buy", target - position) # buy 150
elif target < position:
print("sell", position - target)
else:
print("hold")インデントが構造をつくる
if の下でインデントされた行が、その if に属するブロックです。左端に戻った最初の行はブロックの外です。1段につき半角スペース4つを、いつも同じ方法で使いましょう。Pythonに波かっこはなく、インデントがそのまま構造なので、インデントを誤るとプログラムの動作が変わります。
# The indented lines are the block that belongs to the if
price = 184.5
if price > 184:
print("above 184") # above 184
print("still inside the if")
print("always runs") # back at the left margin順序が大事:最初に当てはまった分岐が勝つ
真になった最初の分岐だけが実行されるので、elif の連なりではしきい値が使えます。各分岐は「新しく加わる条件」だけを書けばよいのです。手数料の段階表が典型例です。最も狭い(具体的な)条件を先に置きましょう。そうしないと、上にある広い条件がそのケースを取り込んでしまいます。
# elif branches are checked top to bottom; the first True wins
monthly_volume = 3_500_000
if monthly_volume < 1_000_000:
rate = 0.0010
elif monthly_volume < 10_000_000:
rate = 0.0007
else:
rate = 0.0004
print(rate) # 0.0007早めに return する
関数の中では、return がその場で関数を終わらせます。そのため、ケースごとに if と return を書けば、else も深いネストも不要になり、最後の行が既定の結果になります。こう書いたコードは平らなままで、ルールの一覧のように読めます。
# Early returns keep a function flat
def side(position, target):
if target > position:
return "buy"
if target < position:
return "sell"
return "hold"
print(side(100, 250), side(250, 100), side(100, 100)) # buy sell hold1行で選ぶ
if が2つの値のどちらかを選ぶだけなら、条件式のほうが短く書けます。value_if_true if condition else value_if_false の形です。式なので、f文字列や return の中にも置けます。単純な選択にはこれを、処理が増えたら通常の if を使いましょう。
# A one-line choice between two values
cash = 40.0
status = "ok" if cash >= 0 else "overdrawn"
print(status) # okis_open がすでに真偽値なら、if is_open: や if not is_open: と書きます。if is_open == True: は同じことをぎこちなく言っているだけです。数値や文字列の if x: も同様で、「0でない」「空でない」を判定します。- 結果が2つ:
if/else、または1行の条件式 - 順序のある複数の範囲:
elifの連なり(最も狭い条件を先に) - 特殊なケースや不正な入力:早めの
return、通常のケースは最後に
次は for ループと range です。要素ごとにコードのブロックを繰り返します。
ラボ:採点される内容
order_sideで買い・売り・保有を判断する25点fee_tierで取引量に応じた手数料率を選ぶ25点clampで値を2つの上下限の間に収める25点crossover_signalで2本の平均をシグナルに変える25点