上級マクロ経済学

第4回 pythonによる条件文と繰り返し処理

Author

荻巣嘉高

条件式

条件式をもとに、処理を分岐させることができます。

  • 条件式の例を再掲。
# リストに入っているかどうか
test_list = [0,1,2,3]
3 in test_list # test_listに3が入っている
True

# 等価
3 == 4 # 3と4が等しい
False
3 > 2 # 3が2より大きい
True

1 if分岐とforループ

if分岐

ある条件を

  • 満たす時
  • そうでない時

それぞれで別の処理をしたい場合、if分岐を使う。

ifのみの処理

  • ifの後に半角スペース
  • 条件式を書く
  • 条件式のあとに:を書く
  • 改行する
    • 自動でインデント(少し長い空白)が入る
    • インデントが入らない場合tabキーを押してインデントを入れる。
  • 条件式がTrueの時にインデントされている部分が実行されます。
a = -1
if a < 0: # 条件を満たすとインデント部分が実行される。
    print("aは負の数です")
aは負の数です
a = 1 # aを変更する
if a < 0: # 条件を満たさないとインデント部分が実行されない
    print("aは負の数です")

例:絶対値をとる計算(ifのみ)

a = -1 # aを与える

if a < 0: # もしaが負なら
    print(str(a)+"は負の数です。")
    b = a*(-1)
    print(str(a)+"の絶対値は"+str(b)+"です。")

if a >= 0:
    print(str(a)+"は正の数です。")
    b = a
    print(str(a)+"の絶対値は"+str(b)+"です。")
-1は負の数です。
-1の絶対値は1です。
  • aを変えて実行してみてください。

ifelse

  • ifのインデントのブロックの後に使う。
  • if以下が成立しないとき」にelseのブロックの処理が行われる。
a = -1
if a < 0:
    print("aは負の数です")
else:
    print("aは負の数ではありません")
aは負の数です
  • aを変えて実行してみてください。
a = 0
if a < 0:
    print("aは負の数です")
else:
    print("aは負の数ではありません")
aは負の数ではありません

elif

  • ifelseの間に挟めます。
  • if条件を満たさなかった際に、さらに条件を足せます。
a = 0
if a < 0: # aが負
    print("aは負の数です")
elif a>0: # 「aが負ではない」かつ「aが正」
    print("aは正の数です")
else: # 「aが負ではない」かつ「aが正ではない」
    print("aはゼロです")
aはゼロです

forループ

繰り返しで同じ処理を行う場合、forループを使います。

for i in [10,20,30]: # コロンを忘れずに!
    # ここから
    print("いまはi="+str(i)+"です。") 
    # ここまで
いまはi=10です。
いまはi=20です。
いまはi=30です。
  • inの後のリスト[0,1,2]の左から順にiに代入されていきます。
  • インデントされているブロックがの終わりに来ると、iが一つ進みます。
  • リストの終わりまでiが繰り返されたら、ループが終了します。

forで扱うリスト

  • range(y)0からy以下で、1ずつ増えていくようなリストを入れることができる。
for i in range(5): # iが[0,1,2,3,4]を順に巡る
    print("いまはi="+str(i)+"です。") 
いまはi=0です。
いまはi=1です。
いまはi=2です。
いまはi=3です。
いまはi=4です。
  • iに関連付けないでも、要素の数だけループしてくれる。
for i in range(5): # 5回ループする
    print("ループします")
ループします
ループします
ループします
ループします
ループします
  • range(x,y)xからy以下で、1ずつ増えていくようなリストを入れることができる。
for i in range(2,5): # iが[2,3,4]を順に巡る
    print("いまはi="+str(i)+"です。") 
いまはi=2です。
いまはi=3です。
いまはi=4です。

forで扱う代数

代数は別にiじゃなくてもよい。

name_list = ["佐藤", "鈴木", "近藤"]

for name in name_list: #name_listの中身が順にnameに代入されてゆく
    print("あいつは"+name+"です。")
あいつは佐藤です。
あいつは鈴木です。
あいつは近藤です。
  • リストを巡りたい場合、len()関数で長さを取得したりする。
name_list = ["佐藤", "鈴木", "近藤"]
age_list = [20, 23, 34]
list_length = len(name_list) # name_listの要素の数=3が代入される

for j in range(list_length): # range(3)と同じ
    name = name_list[j]
    age = age_list[j]
    print(name+"は"+str(age)+"歳です。")
佐藤は20歳です。
鈴木は23歳です。
近藤は34歳です。

例:演算を繰り返す。

\sum_{x=0}^{10} x = 0+1+2+\cdots + 10

y = 0

for i in range(11): # 11より小さい整数(10)まで
    y = y + i # いまのyの値にiを足して、yをアップデートする。

print(y)
55

例:リストを追加していく。

<list>.append(x)x<list>の後ろに追加する。

test_list = [] # 空のリストを作成
print(test_list)
[]
test_list.append(10) # 10を追加
print(test_list)
[10]
  • 0から10までの要素を持つリストを作成する。
test_list = [] # 空のリストを作る

for x in range(11): # 11より小さい整数(10)まで
    test_list.append(x)

print(test_list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

while文

  • ’while’文は、’while’以下の条件がTrueである限り、インデント部分の処理を繰り返す処理。
a = 0 # 初期値を決める

while a<100: # aが10より小さい限り処理を続ける。
    a = a + 1 # 条件を満たしているとき、aに1を加える。

print(a)
100

whileの注意点

  • forよりバグが起きやすいので注意(無限処理)。
a = 0 # 初期値を決める

while a<100: # aが10より小さい限り処理を続ける。
    a = a  # 「条件を満たしているとき、aに1を加える」つもりが、1を足し忘れる。

print(a) # 処理が終わらないので、aが出力されない。

例:7の倍数を取り出す

1から100までの中で、7の倍数のみを取り出してみよう。

  • ifとforを組み合わせる例
result = [] # 結果を保持するリストを作成する

for i in range(1,101): # 1から100までのiについて
    m = i%7 # 7で割った余りを計算
    if m==0: # 7で割った余りが0なら、割り切れる
        result.append(i) # 割り切れる場合、結果をリストに保存する

## 結果を表示する
print("--------------------------------------")# ハイフンで線を入れる(単に見やすくするため)
print("1から100までで、7の倍数は次の数だけ存在する。")
print(len(result))
print("--------------------------------------") # ハイフンで線を入れる(単に見やすくするため)
print("具体的に書くと、次の数が該当する。")
print(result)
--------------------------------------
1から100までで、7の倍数は次の数だけ存在する。
14
--------------------------------------
具体的に書くと、次の数が該当する。
[7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]

2 関数

関数

同じような処理を何度も繰り返す際に、処理をひとまとめにしたものを関数という。

  • def f(x):で変数xを持つfという関数を作る。
  • インデントブロックが関数の中身の処理。
  • 返り値returnで指定できる。
def make_to_list(x):
    return_list = [] # 空のリストを作る

    for i in range(x+1): # x+1より小さい整数(x)まで
        return_list.append(i)

    return return_list # return_listを返す
  • 関数を使う
make_to_list(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

コードの作成とコメント

  • デバッグしやすくするために、コメントを残して関数を作ります。
  • 自分で描いたコードも、後から見て処理の意図がわからない場合も多々あるので、コメントはなるべく入れるべき。
def make_to_list(x):
    """
    コメントアウトで関数の中身の説明を入れたりします。
    デバッグしやすくなるためです。
    ------------
    input:
        x : int
    ------------
    output: 0 to x list
    """

    # 実際の処理はここから
    return_list = [] # 空のリストを作る

    for i in range(x+1): # x+1より小さい整数(x)まで
        return_list.append(i) # return_listに追加していく

    return return_list # return_listを返す

make_to_list(10) # テストで出力してみる
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

演習例:小数第n位の取得

ある数xの小数第n位を取得する関数を作ろう。

def get_nth(x,n):
    """
    xの小数第n位を取得する
    input
        x (float) : 小数を取得したい数
        n (int) : 取得する小数点以下第n位のn
    output (int) :
        xの小数第n位の値
    """
    y = x*10**n # 小数第n位の値が1の位にくるようにする
    m = y%10 # 10で割った余りを計算すると、1の位+小数点以下になる
    m_text = str(m) # 文字列に変換
    num_text = m_text[0] # 一番初めの値を取得したいので、第0要素を取得
    num = int(num_text) # num_textは文字列形式で保存されているので、整数形式に変換
    
    return num # 結果を返す。


pi = 3.14159265359
print(get_nth(pi, 2))
4

まとめ

  • ここまでできるとたいていのことならできます。
  • プログラミングは、基本的には、習うより慣れろです。
  • 次回からはライブラリを用いた処理をします。
    • Numpy
    • Matplotlib
    • Pandas