特定の式が真であるか偽であるかを判定し, 異なるコードを実行したいとしましょう.
例えば, income
, tax_rate
を整数型の変数として,
income
の値が 1,000,000 未満であれば tax_rate = 0.0
income
の値が それ以上のときは tax_rate = 0.1
というように, 所得に応じた税率を設定したいようなケースです. 次のように書きます.
if income < 10 ** 6:
tax_rate = 0.0
else:
tax_rate = 0.1
このコードがやろうとしていることは, なんとなく読み取っていただけると思います.
if
の終わりから :
(コロン) まで間に条件を書きます. 条件が真であれば直後の行が実行され, 偽であれば,
else:
に続く行が実行されます.
実際に, 動かしてみましょう. 上のコードをコピーして, IPython シェルにペーストします. ペーストをするときには,
IPython マジックコマンド %paste
を使います.
In [1]: income = 10 ** 7
In [2]: %paste
if income < 10 ** 6:
tax_rate = 0.0
else:
tax_rate = 0.1
## -- End pasted text --
In [3]: tax_rate
Out[3]: 0.1
条件判定後に実行される行は, 1行だけである必要はありません. 次のような書き方も可能ですし, もっと行を増やすこともできます.
if income < 10 ** 6:
tax_rate = 0.0
subsidy = 10000
else:
tax_rate = 0.1
subsidy = 0
このコードも, コピー → %paste
で動きを確認しておいてください.
すでに, 気づいている人もいるかもしれませんが, if
から else
の間に書かれている
コードはインデントされています. 他のプログラミング言語の経験のある人は, 「コードを読みやすくするためにこのようにしている」と考える
かもしれません. しかしそれは正しくありません. Python では, コロンで終わる行の次の行から, インデントレベルが戻るまでのコードを
塊 (ブロック) として扱います.
したがって, 次のようなコードはエラーになります. コピー → %paste
で確認してみましょう.
if 0 < 1:
print('0 is smaller than 1')
In [4]: %paste
if 0 < 1:
print('0 is smaller than 1')
## -- End pasted text --
このインデントはスペース4つにするのが標準です. if
節の中のブロック, else
節の中のブロックで使われるインデントを紹介しました.
Python ではいたるところでインデントが現れます. 基本ルールは同じなので, 混乱することはないでしょう.
タブをスペース4つに展開してくれるテキストエディタが必要な理由が分かっていただけたと思います.
もっと沢山の場合分けをしたくなることもあります.
income
の値が 1,000,000 未満であれば tax_rate = 0.0
income
の値が 1,000,000 以上, 5,000,000 未満であれば tax_rate = 0.1
income
の値が 5,000,000 以上, 10,000,000 未満であれば tax_rate = 0.2
tax_rate = 0.3
というコードは, 次のように書けます.
if income < 10 ** 6:
tax_rate = 0.0
elif income < 5 * 10 ** 6:
tax_rate = 0.1
elif income < 10 ** 7:
tax_rate = 0.2
else:
tax_rate = 0.3
elif
は else if を表すキーワードです.
条件判定に使う式・変数の値があらかじめ決まっているのであれば, if-elif-else
には何の意味もありません.
どんな値が入るかが分からないような状況を作って実験してみましょう. 1つの例を挙げますので, 他にどのような使い道があるか考えてみてください.
テキストエディタで次のファイルを作ってください. ファイル名は condition_input.py
とします.
# condition_input.py
raw_input = input('Enter income: ') # 1, 2
income = int(raw_input) # 3
if income < 10 ** 6:
tax_rate = 0.0
elif income < 5 * 10 ** 6:
tax_rate = 0.1
elif income < 10 ** 7:
tax_rate = 0.2
else:
tax_rate = 0.3
print('tax rate is', tax_rate)
input()
はユーザーに入力を求める組み込み関数です. 入力してリターンキー (エンターキー) を叩くと, 入力内容が文字列として出力されます.raw_input
変数は input()
の出力文字列を参照しています.int()
は文字列を整数に変換する組み込み関数で, これによって raw_input
から整数変数 income
を作ることができました.IPython シェルで次の挙動を確認してください.
In [5]: %run condition_input
Enter income: 100000000
tax rate is 0.3
ここではキーボード入力を条件判定しましたが, データを読み込んで値ごとに違う振る舞いをさせるようなことも考えられます.
入力値がランダムに決まる場合にも条件判定が役に立ちます.
# condition_random.py
import random # 1
dice1 = random.randrange(1, 7) # 2
dice2 = random.randrange(1, 7)
total = dice1 + dice2 # 3
if total % 2: # 4
print('Even: total is', total)
else:
print('Odd: total is', total)
random
モジュールは擬似乱数を生成する関数群を提供しているrandom.randrange(1,7)
は1以上, 7未満の整数をランダムに生成このコードを実行してみましょう.
In [6]: %run condition_random.py
Even: total is 5
In [7]: %run condition_random.py
Even: total is 3
In [8]: %run condition_random.py
Odd: total is 6
In [9]: %run condition_random.py
Odd: total is 6
In [10]: %run condition_random.py
Even: total is 9
In [11]: %run condition_random.py
Even: total is 5