【初心者向け】if文とは何か?Pythonを使って制御構文を学ぼう!

制御構造

プログラムは、上から下に処理が実行されます。
決められた文法で処理方法を記述します。
この章では、if文やLoop文などを習い、プログラムの流れを制御する方法を学びます。

プログラム処理の流れ

プログラムの基本的な流れは上から下の順に流れていきます。

上の図をPythonのプログラムで記述すると、例えば下記のようになります。

実行すると、次の内容が順に出力されます。

最初の処理
次の処理
最後の処理

つまり、基本的にプログラムは記述した順に上から下へと流れて処理されます。

コードブロックとインデント

Pythonでは、インデント(字下げ)で処理をまとめます。
このインデントはPythonの大事な特徴になります。
基本的には、半角スペース4つもしくはタブキーがインデントの役割になりますが、Pythonの文法では、
末尾にコロン「:」がつく構文が多いです。
(条件分岐文(if, elif, else)、for文、while文、関数、クラスの定義)

末尾に:が出てきたら、インデントをする必要があるというのがPythonの決まりになっています。
例えば、:があるサンプルプログラムとして次を見てください。
この章では、これからif文及びfor文などを説明して行きますので、今の段階では下記のプログラムの意味が理解できなくて構いません。
一旦は:が出てきたらインデントが必要だということを理解してください。

for i in range(10):
    if i%2==0:
        print("{} is even.".format(i))
    else:
        print("{} is odd.".format(i))

"""
出力結果
0 is even.
1 is odd.
2 is even.
3 is odd.
4 is even.
5 is odd.
6 is even.
7 is odd.
8 is even.
9 is odd.
"""

条件分岐 (if文)

VIDEO

プログラミングでは、ある条件に当てはまるかどうかによって処理を分けます。
例えば「テストの点数(条件)によって成績(処理)を変える」というのも条件分岐で表すことが可能です。
構文としては次のようになります。

# 注) このコードは動作しないので注意です。
if 条件A:
    条件AがTrueなら実行
elif 条件B:
    条件AがFalseかつ条件BがTrueなら実行
else:
    条件AもBもFalseなら実行

if文を用いると「もし○○ならば☓☓を行う」という処理を、条件分岐によって表現できますので、例えば、テストの点数がが78点以上であれば、合格と出力するプログラムは次のように記述できます。

# ifの後に条件式を指定し、その条件が成り立つときに実行する処理を次の行に書きます。

score = 80
if score > 78: # 比較演算子 > を使っています。比較演算子はこの後に説明します。
    print("合格です")

条件式の作り方

条件式の中では、2つの値を比較するための記号「比較演算子」がよく使われます。
比較演算子には下記の画像のような演算子があります。
右辺と左辺が等しいかどうかを表すには == を使います。
また、右辺と左辺が等しくないかどうかを表すには != を使います。

条件部分は、「if 条件式 :」のように書きます。
行末のコロンをつけ忘れるとエラーになってしまいますので注意です。

score = 80
if score > 78: # 比較演算子 > を使っています。
    print("合格です。おめでとう!")
else:
    print("不合格。次回頑張りましょう。")

score = 100
if score == 100:
    print("満点")
elif score > 85:
    print("合格!")
else:
    print("不合格。次回頑張りましょう。")

Pythonではコードの字下げ(インデント/半角スペース2もしくは4つ)がそのままプログラムの動作に影響しますので、字下げ(インデント)に気をつけましょう。

ループ

ほとんどのプログラミング言語で制御構文の基本はループです。
ループは複数回同じコードを実行するための制御構文です。
よく、リストの各要素に同じ処理をしたいときに使います。

for文

VIDEO

for文によるループ処理を見ていきます。
for文の書式は次の通りです。

"""
for ループ内変数 in リスト名:
    実行する処理
"""

for i in ["apple", "banana", "melon"]:
    print(i)


# 出力結果
"""
apple
banana
melon
"""

リストがループ内変数のiに格納され、それが出力(print)されています。
詳しく説明します。
まず、先頭のapple(添え字0番目)という要素が変数iに代入され、print(i)で出力されます。
次に、bananaが取り出され、iに代入、最後のmelonも同様にiに代入され出力されます。
リストの要素を全て取り出したため、このfor文の処理はその時点で終了します。

for文で一定回数の繰り返し処理を行うにはrange()関数を用いることが多いです。

range()関数は次のような役割を持ちます。

range(x): 0からx-1までの連番のリストを返す
range(x,y): xからy-1までの連番のリストを返す

例えば、range()を用いて、0~9までの計10回繰り返すプログラムは次のようになります。

for i in range(10):
    print(i)

# 出力結果
"""
0
1
2
3
4
5
6
7
8
9
"""

他の繰り返し処理の例も見てみましょう。
少し長いですが、じっくり読んでみてください。

data = [20, 40, 60, 88]
for d in data:
    print(d)


# 出力結果
"""
20
40
60
88
"""

# (1)
sum_d = 0
for d in data:
    # *=で、かけわせることもできます。
    sum_d += d # sum_d = sum_d + dを省略した書き方です。

print(sum_d) # 208が出力。20 + 40 + 60 + 88を足し合わせた数。


"""
出力結果
208
"""

# for文はelseを使用することができる。

sum_d = 0

# (2)
for d in data:
    sum_d += d
# ループが終わったら1回処理したいものが処理できる。
else:
    print(sum_d)


"""
出力結果
208
"""


"""
Pythonでは、ここで見たfor文、後から見るWhile文のループでelseを使うことが出来ます。
elseを記述すると、ループが終了するときにelseの中が処理されます。
"""

# 上の(1)と(2)はelseを使っているかどうかの違いですが、出力結果は同じです。


## breakとcontinue

# cotinue 1回スキップ
for i in range(10):
    if i == 3:
        continue
    print(i)

"""
出力結果
0
1
2
4
5
6
7
8
9
"""

# break 処理を終了
for i in range(10):
    if i == 3:
        break
    print(i) # 0 1 2を出力


"""
出力結果
0
1
2
"""


"""
先ほど見たelseをfor文と使う際に、「break」を使うと、elseの中の処理は実行されないので注意です。
この場合ですと、リスト内に"f"があるので、foundが出力されますが、
else内のnot foundは出力されません。
"""

data = [1, 2, 3, 4, 5, "f"]
for x in data:
    if x == 'f':
        print('found')
        break
else:
    print('not found') # このサンプルの場合elseの処理は実行されない!

"""
出力結果
found
"""

pythonのforはiterator(イテレータ)と呼ばれる仕組みで、
タプルや、文字列、辞書などもkeyとして使えます。

for char in "hello":
    print(char)
"""
h
e
l
l
o
"""

リストの要素を順に処理しつつ、インデックス番号も知りたい場合があるかと思います。
その場合、enumerate()を使います。

for index, name in enumerate(["apple", "banana", "melon"]):
    print(index, name)
"""
0 apple
1 banana
2 melon
"""

またlist()とrange()を組み合わせると、次のような1~100までの要素を持ったリストを簡潔に記述することも出来ます。

print(list(range(101)))

"""
# 出力結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
"""

辞書型のデータをループする

辞書型のデータをループするには次のように記述します。

data = {"tani": 21, "kazu": 22, "python": 100}
for key, value in data.items():
     print("key: {} value: {}".format(key, value))


"""
key: tani value: 21
key: kazu value: 22
key: python value: 100
"""

while文

while文は、特定条件を満たすまでループを繰り返します。
〜の間はずっとループといったイメージで、forほど使う頻度は少ないですが、
明示的に無限ループを行いたい場合は、whileでのループ処理を記述します。

# nが10になるまで繰り返し
n = 0
while n < 10:
    print(n)
    n += 1 # +1するのを忘れずに。

"""
出力結果
0
1
2
3
4
5
6
7
8
9
"""

n += 1もしくは、n = n + 1を記述しない場合、無限ループになってしまいます。
無限ループに入ったら、Ctrl + cで終了してあげましょう。
無限ループにならないように注意が必要です。

無限ループ

ちなみに、無限ループを故意にするには、次のように書きます。

# 無限ループですので、下記プログラムを実行する場合は、Ctrl + cで終了してください。
# もしくはターミナル/コマンドプロンプトを強制的に終了(閉じて)ください。
while True:
    print("無限ループ")

リスト内包表記

リスト内包表記(List Comprehensions)は既存のリストやジェネレータから新しいリストを作るものです。
例えば、以下は1から10までの数値をそれぞれ2乗した数値のリストを作る場合のプログラムを、リスト内包表記で記述したサンプルです。

result = [x**2 for x in range(1,11)]
print(result) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 通常のループでは次のようになります。
result = []
for i in range(1,11):
    result.append(i**2)

print(result) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

リスト内包表記は、既存のリストから取り出した要素に対し処理をするだけでなく、条件に応じた場合にだけ新しいリストに追加したい場合にも使えます。
内包表記のメリットは、処理を簡潔に書け、新しいリストなどへの追加メソッドの呼び出しにかかるコストを軽減できます。

その他内包表記

リスト内包表記以外にも、セットと辞書を生成する内包表記もあります。
セットと辞書内包表記の場合、生成する値によっては出力される値の順番が保持されない場合もありますので、利用の際にはご注意ください。

s = {x**2 for x in range(1,6)}
print(s) # {1, 4, 9, 16, 25}

辞書内包表記の書き方は、キーと値をコロン「:」で区切り、
セット内包表記と同様に{}を使います。

d = {x*2:x**2 for x in range(1,11)}
print(d) # {2: 1, 4: 4, 6: 9, 8: 16, 10: 25, 12: 36, 14: 49, 16: 64, 18: 81, 20: 100}

また、tuple内包表記に関してですが、下記のように記述するとgenerator(ジェネレータ)になります。
()で定義すると、タプル内包表記にはなりませんので注意です。
返ってくるのは要素を生成するgeneratorになります。
※generatorという言葉の意味は一旦理解しなくて構いません。
tupleの時はセット型と辞書型とは違いgeneratorが返ってきて、list()でキャストすると内包表記を実現できるというのを知っていれば問題ありません。
tupleにする際には、tuple()でキャストする必要があります。

t = (x for x in range(5))
print(t)
# <generator object <genexpr> at 0x1095c8eb8>

t = tuple([x for x in range(5)])
print(t) # (0, 1, 2, 3, 4)

標準入力

input()を用いることで、ユーザからの入力を受け取ることが可能です。
※Python バージョン2系では、raw_input()でしたが、Python3系では、raw_input()は使えず、input()を使います。
以下のプログラムを実行すると、コンソール(Macの方は、ターミナル、WIndowsの方はコマンドプロンプト)の入力が待ち状態になり、何かをコンソールに入力するとinput()で入力値を受け取ります。

print("名前を入力してください")
name = input()
print("あなたの名前は"+name+"です")

ここで1つ注意ですが、input()を使って受け取った値は、文字列型になります。
数値を入力した場合、文字列型にキャストされてしまいますので、その後の数値処理には気をつけてください。
(一旦int()等でキャストを行ってください。)

以下は無限にユーザが入力した内容を出力するプログラムです。
受け取った値を変数iに代入し、print()でiを出力します。

# Ctr-Cで終了します。
while True:
    print("Please Input!")
    i = input()
    print(i)

まとめ

ここでは、制御構文をみてきました。
条件分岐やループ処理は今後もよく利用することが多くなるので、使いこなせるようにしましょう。

演習問題

1) 3 2 1 Go! と出力するプログラムをfor文を使って記述してください。

2) 1 – 100までの数字の中から偶数の値を持つ値だけのListを作成してください。

演習問題回答

 

Leave a Reply