sec03 - Python初心者のための制御フロー入門:if文・ループ・関数・例外処理の全体像
スポンサーリンク

Pythonの制御フローとは

プログラムは基本的に上から下へ順番に1行ずつ実行されます。しかし、このままでは複雑な処理を記述することはできません。

条件によって分かれ道を作ったり、同じ処理を繰り返したり、エラーに対応したりする必要があります。これらをまとめて 制御フローControl Flow) と呼びます。

各項目の詳細は専用のレクチャーで解説します。ここでは、制御フローのセクションでどのような内容を学習するのか、イメージをつかんでいただければと思います。

Python制御フローで押さえる4つのカテゴリー

Pythonの制御フローは、大きく次の4つのカテゴリーに分けられます。

  1. 条件分岐(if文)
  2. 繰り返し処理(forループ)
  3. 関数
  4. 例外処理

この4つの仕組みを理解すると、Pythonで自分の思い通りに処理の流れを作れるようになります。

スポンサーリンク

Pythonの条件分岐(if文)の概要

プログラムが「状況に応じて動作を変える」ための仕組みです。たとえば「もし雨なら傘を持つ」「晴れていたら散歩する」といった、現実の判断をプログラムで表現できます。

if, elif, elseの基本

条件分岐の中心となる文法は次の通りです。

  • if で「もし〜なら」を書く
  • elif で「前の条件に当てはまらなかったときの、次の条件」を追加できる
  • else で「どれにも当てはまらないとき」を指定できる

また、ifの中にさらにifを書くことで、より細かい分岐(ネスト)も可能になります。

コードの詳細な記述方法は専用のレクチャーで学習しますので、ここでは簡単な例を見てみましょう。天気の様子によって行動を分岐させるコードを書く場合、if, elif, elseのキーワードを下記コードのように組み合わせて記述します。

weather = 'sunny'

if weather == 'rain':
    print('傘を持っていこう!')
elif weather == 'sunny':
    print('今日は散歩に出かけよう')
elif weather == 'cloudy':
    print('洗濯物は部屋干しが安心かな')
else:
    print('よく分からない天気です')

条件式で使用する比較演算子・その他のキーワード(and, or, bool, None)

条件式で使用する比較演算子(等号・不等号)や、その他のキーワード(and, or, bool, None)についても詳しく学習します。

  • 比較演算子(==, !=, <, >, <=, >=)
    • 値どうしを比べるときに使用する
    • 例:== は「等しい」、!= は「等しくない」
  • and / or
    • 複数の条件を組み合わせられる
  • bool型(True / False)
    • 条件分岐の基本となる値
  • None
    • 「何もない」を表す特別な値で、条件式の中ではFalseとして扱われる
score = 75

if score >= 70:
    print('優秀!')
elif score < 40:
    print('再試験')
else:
    print('及第')

Pythonの繰り返し処理(ループ)の概要

Pythonでは、同じ処理を繰り返すときにループを使います。例えば、商品の値段を合計したり、目標温度に達するまで温度を測定したり、未完了のタスクを処理したりできます。

for文の基本

for文は、listやdictなどのイテラブルの要素を順番に処理するために使います。基本形は for variable in iterable: です。

次のコードは、果物の値段の合計値を足し合わせるコードです。dictが持っている要素分繰り返し処理を行っています。

fruits_prices = {
    'apple': 100,
    'banana': 150,
    'orange': 120
}

total_price = 0

# dictのvalue(値段)を繰り返しtotal_priceに足し合わせる
for price in fruits_prices.values():
    total_price += price  # 値段を合計

print('果物の合計金額:', total_price)

while文の基本

while文は、条件が満たされる間、処理を繰り返します。条件がFalseになるとループが終了します。

for文は、繰り返す数が決まっているものに対して使われることが多いです。whileは、どれくらい繰り返すのかわからず、ある条件を満たす限り繰り返し続けるような処理に使用されます。

次のコードは、どのような場面で使われるのかをイメージしていただくものです。例えば、ヒーターの制御プログラムで、ある一定の温度まで室温を上昇させたいとします。現在の室温と設定温度の情報を取得した後、設定温度より現在の室温が低い間、ヒーターをonにし続けます。設定温度に達するタイミングが不明なため、常に室温を監視し、設定温度以上になるまで処理を繰り返します。室温が設定温度に達したら繰り返し処理を抜け、ヒーターを止めるための処理を行います。

# ※このコード例には、実際には存在しない関数を使っているため、そのままでは動作しません

current_temp = get_current_temperature()
target_temp = 22

while current_temp < target_temp:    
    heater_on()  # ヒーターを作動させる処理
    current_temp = get_current_temperature()  # 室温を再取得

heater_off()  # 目標温度に達したので、ヒーターを止める

ループ制御(continue / break / else)の概要

ループ中に、条件に応じて処理をスキップさせたり、途中で終了させることができます。

continue

  • その回のループの残りの処理をスキップして、次の回に進む
  • 例:条件に合わない場合は処理をスキップする

break

  • ループを途中で終了させる
  • 例:目標に達したら繰り返しをやめる

else(ループと組み合わせて使用)

  • ループが途中で break されずに最後まで実行されたときだけ処理を行う
  • 例:全ての要素をチェックした後に「問題なし」と表示する

ここでは、未完了のタスクのlistを作るという例でcontinueを使ってみます。変数"tasks"は、タスク名とタスクが終了しているかどうかの情報を管理しています。タスクの情報をforループで取り出して、そのタスクが完了済だった場合にcontinueし、残りの処理を実行させないようにします。この例では、完了済タスクが"unfinished_tasks"のlistに追加されるのを防ぎます。

tasks = [
    {'name': 'wash dishes', 'done': True},
    {'name': 'do homework', 'done': False},
    {'name': 'clean room', 'done': False},
    {'name': 'walk dog', 'done': True}
]

unfinished_tasks = []

for task in tasks:
    if task['done']:
        continue  # 完了済の場合、繰り返し処理の先頭に戻る
    unfinished_tasks.append(task['name'])

print('未完了のタスク:', unfinished_tasks)

Pythonの関数の役割と概要

関数とは、プログラムの処理をまとめて名前をつけたものです。

関数を使うことで、毎回同じ処理を何度も書かなくても、関数名を呼び出せばその処理が実行されます。関数は必要に応じて外から値を受け取ったり(引数)、処理の結果を返すこともできます。

関数の基本的な役割

関数を作るときは def に続けて関数名を書きます。そして、return で結果を返すことができます。

次のコード例は、現在時刻を取得し、時間帯に応じて挨拶を変化させています。この処理を関数として作っておけば、greeting()として呼び出すだけで時間帯に応じた挨拶を取得することができます。

from datetime import datetime

def greeting():
    hour = datetime.now().hour
    if 5 <= hour < 12:
        return "Good morning!"
    elif 12 <= hour < 18:
        return "Good afternoon!"
    elif 18 <= hour < 22:
        return "Good evening!"
    else:
        return "Good night!"

message = greeting()
print(message)

引数

関数は必要に応じて引数(ひきすう)を指定し、外部から値を受け取って関数内で利用できます。

次の例は、引数で受け取った値を足し合わせ、その合計値をreturnで返します。

def add_price(price1, price2):
    total = price1 + price2
    return total

result = add_price(100, 250)
print("合計金額:", result)

変数のスコープとは(変数の有効範囲)

変数には有効な範囲があります。関数の中で作った変数は、その関数の外からは使えません。ですので、関数Aで作った変数を関数Bから直接取ることはできません。もし、関数Aの中で生成されたデータが必要な場合は、関数Aから返り値を返すか、グローバル変数を使うことになります。

def make_discount(price):
    discount = price * 0.8
    return discount

print(make_discount(200))  # returnで160.0が返され、print出力される
print(discount)  # 関数の外から、"discount"変数の情報を直接取ることはできない

Pythonの例外処理の基本的な考え方

プログラムの実行中に、予期しないエラーが発生する場合があります。例外処理は、そのようなエラーを検知し、例外発生時にプログラムがクラッシュせず、処理を続けるための仕組みです。

Pythonでは tryexcept を使用して記述します。

基本構文(try / except / else / finally)

  • try
    • エラーが発生する可能性のある処理を記述します。
  • except
    • 発生したエラーに応じた処理を記述します。複数のエラーを個別に処理することも可能です。
  • else
    • 例外が発生しなかった場合に実行されます。必須ではありません。
  • finally
    • 例外の発生に関わらず、必ず実行される処理を記述します。リソースの解放などに利用されます。必須ではありません。
try:
    number = int(input("数字を入力してください: "))
    result = 100 / number
except ValueError:
    print("数字を入力してください")
except ZeroDivisionError:
    print("0では割れません")
else:
    print("計算結果:", result)
finally:
    print("処理が終了しました")

カスタム例外

Pythonでは組み込みの例外に加え、独自の例外を定義することも可能です。独自ルールに基づくエラーを発生させたい場合に便利です。

  • raise
    • カスタム例外を発生させるキーワードです。
  • except
    • 発生したカスタム例外を捕捉し、安全に処理を継続するために使用します。
# 独自のエラーを定義する
class OutOfStockError(Exception):
    pass

# 在庫が0の時に"OutOfStockError"を発生させる
def buy_item(stock):
    if stock <= 0:
        raise OutOfStockError("在庫がありません")
    print("購入できました")

# tryの処理でエラーが発生したら、exceptのブロックが実行される
try:
    buy_item(0)
except OutOfStockError as e:
    print(e)

スポンサーリンク