Python の制御構造

PythonBeginner

はじめに

この実験では、Python の基本的な制御構造である条件分岐とループについて学習します。これまでの実験で得た知識を土台として、if-else 文、for ループ、while ループを使用してプログラムの流れを制御する方法を学びます。この実践的な体験を通じて、Python の中核となる概念への理解を深め、より複雑で動的なプログラムを作成するための準備を整えましょう。

条件分岐の理解

このステップでは、Python の条件分岐、特に if-else 構造について学びます。

ターミナルで次のコマンドを入力して、Python インタプリタを起動します。

python

Python のプロンプト(>>>)が表示されれば、Python インタラクティブシェルに入ったことになります。

Python Interpreter

まずはシンプルな if 文から始めましょう。Python インタプリタに次のように入力してください。

age = 20
if age >= 18:
    print("You are an adult.")

出力結果:

You are an adult.

ヒント: インデント(字下げ)には注意してください。Python ではインデントが非常に重要です。インデントには 4 つのスペースを使用することが推奨されています。

if 文は、条件 age >= 18 が真(True)であるかどうかをチェックします。真であれば、インデントされたコードブロックが実行されます。

次に、else 節を追加してみましょう。

age = 15
if age >= 18:
    print("You are an adult.")
else:
    print("You are a minor.")

出力結果:

You are a minor.

else 節は、条件が偽(False)だった場合に実行される代替のアクションを提供します。

より複雑な条件の場合は、elif(else if の略)節を使用できます。

age = 65
if age < 13:
    print("You are a child.")
elif age < 20:
    print("You are a teenager.")
elif age < 65:
    print("You are an adult.")
else:
    print("You are a senior citizen.")

出力結果:

You are a senior citizen.

elif 節を使用すると、複数の条件を順番にチェックすることができます。

Python においてインデントは極めて重要であることを忘れないでください。インデントによって、各条件に関連付けられたコードブロックが定義されます。

for ループの探索

このステップでは、Python でシーケンス(リスト、文字列、範囲など)を反復処理するために使用される「for」ループについて学びます。

まずは range を使ったシンプルな for ループから始めましょう。Python インタプリタで次のように入力します。

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

出力結果:

0
1
2
3
4

range(5) 関数は 0 から 4 までの数値のシーケンスを生成し、ループがそれぞれの数値を順番に処理します。

range() 関数には、開始値、終了値、およびステップ値(増分)を指定するために複数の引数を渡すことができます。別の範囲を試してみましょう。

for i in range(1, 10, 2):
    print(i)

出力結果:

1
3
5
7
9
  • range(1, 10, 2) 関数は、1 から始まり 10 未満(10 は含まない)まで、2 ずつ増加する数値のシーケンスを生成します。

次に、リストを反復処理してみましょう。

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(f"I like {fruit}")

出力結果:

I like apple
I like banana
I like cherry

ここでは、ループが fruits リスト内の各要素を順番に処理しています。

文字列に対して for ループを使用することもできます。

for char in "Python":
    print(char.upper())

出力結果:

P
Y
T
H
O
N

このループは、文字列 "Python" の各文字を順番に処理します。

「for」ループと条件分岐を組み合わせてみましょう。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for num in numbers:
    if num % 2 == 0:
        print(f"{num} is even")
    else:
        print(f"{num} is odd")

出力結果:

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
10 is even

このループはリスト内の各数値をチェックし、それが偶数(even)か奇数(odd)かを出力します。

剰余演算子(%)の理解: % 記号は剰余演算子(モジュロ演算子)と呼ばれます。これは、ある数値を別の数値で割ったときの「余り」を返します。例えば:

  • 5 % 21 です(5 を 2 で割ると 2 余り 1 なので)。
  • 4 % 20 です(4 を 2 で割ると 2 余り 0 なので)。
  • 10 % 31 です(10 を 3 で割ると 3 余り 1 なので)。

num % 2 == 0 とチェックするとき、「この数値を 2 で割った余りは 0 ですか?」と問いかけています。もし答えが「はい(余りが 0)」であれば、その数値は偶数です。余りが 1(またはそれ以外)であれば、その数値は奇数です。== は 2 つの値が等しいかどうかをチェックする比較演算子で、等しければ True、等しくなければ False を返します。

while ループの理解

このステップでは、条件が真である限りコードブロックを繰り返す「while」ループについて学びます。

シンプルな「while」ループから始めましょう。Python インタプリタで次のように入力します。

count = 0
while count < 5:
    print(count)
    count += 1

出力結果:

0
1
2
3
4

このループは、count が 5 未満である限り実行を続けます。

「while」ループは、あらかじめ何回繰り返す必要があるか分からない場合によく使われます。例を見てみましょう。

import random
number = random.randint(1, 10)
guess = 0
while guess != number:
    guess = int(input("Guess a number between 1 and 10: "))
    if guess < number:
        print("Too low!")
    elif guess > number:
        print("Too high!")
    else:
        print(f"Congratulations! You guessed the number {number}!")

これは、ユーザーが正しい数値を当てるまで入力を繰り返すシンプルな数当てゲームです。ユーザーの予想が正解と一致すると、else 節が実行され、お祝いのメッセージが表示されます。

「while」ループを使用する際は注意が必要です。条件がいつまでも偽にならない場合、無限ループ(無限に繰り返される状態)に陥ってしまいます。例を見てみましょう(ただし、実際には実行しないでください)。

while True:
    print("This will print forever!")

もし誤って無限ループを実行してしまった場合は、Ctrl+C を押すことで停止できます。

break 文を使用すると、ループを途中で終了させることができます。

count = 0
while True:
    print(count)
    count += 1
    if count >= 5:
        break

出力結果:

0
1
2
3
4

このループは本来であれば無限に実行されますが、count が 5 に達したときに break 文によってループを抜けます。

入れ子構造のループとループ制御文

このステップでは、入れ子(ネスト)になったループと、追加のループ制御文について学びます。

ネストされたループとは、ループの中に別のループが入っている構造のことです。ネストされた for ループの例を見てみましょう。

for i in range(3):
    for j in range(2):
        print(f"i: {i}, j: {j}")

出力結果:

i: 0, j: 0
i: 0, j: 1
i: 1, j: 0
i: 1, j: 1
i: 2, j: 0
i: 2, j: 1

外側のループが 1 回繰り返されるごとに、内側のループはそのすべての反復を完了します。

break に加えて、Python には continue 文があります。これは現在の反復の残りの処理をスキップして、次の反復へ進むためのものです。

for num in range(10):
    if num % 2 == 0:
        continue
    print(num)

出力結果:

1
3
5
7
9

このループは偶数をスキップし、奇数のみを出力します。

この文脈での剰余演算子の理解: ここでは、num % 2 == 0 で数値が偶数(2 で割った余りが 0)かどうかをチェックしています。この条件が True(数値が偶数)の場合、continue 文が実行されて print(num) の行がスキップされ、次の反復に移動します。その結果、奇数(num % 2 が 1 になるもの)だけが print(num) 文に到達します。

ループには else 節を付けることもできます。ループが(break に遭遇することなく)正常に完了した場合に、else ブロックが実行されます。

for num in range(2, 10):
    for i in range(2, num):
        if num % i == 0:
            print(f"{num} is not prime")
            break
    else:
        print(f"{num} is prime")

出力結果:

2 is prime
3 is prime
4 is not prime
5 is prime
6 is not prime
7 is prime
8 is not prime
9 is not prime

このネストされたループは素数を判定します。数値が素数である(内側のループで一度も割り切れず break しなかった)場合に、else 節が実行されます。

実践:学んだことを組み合わせる

最後のステップでは、この実験で学んだ制御構造を活用したシンプルなプログラムを作成します。

exit() と入力するか Ctrl+D を押して、Python インタプリタを終了します。

LabEx VM 環境の WebIDE を開きます。

WebIDE LabEx VM interface

ターミナルで次のコマンドを使用して、~/project ディレクトリに number_analyzer.py という名前の新しいファイルを作成します。

touch ~/project/number_analyzer.py

作成したファイルを WebIDE のエディタで開きます。

次のコードをコピーしてファイルに貼り付けてください。

def analyze_numbers():
    numbers = []
    while True:
        user_input = input("Enter a number (or 'done' to finish): ")
        if user_input.lower() == 'done':
            break
        try:
            number = float(user_input)
            numbers.append(number)
        except ValueError:
            print("Invalid input. Please enter a number or 'done'.")

    if not numbers:
        print("No numbers entered.")
        return

    total = sum(numbers)
    average = total / len(numbers)
    maximum = max(numbers)
    minimum = min(numbers)

    print(f"\nAnalysis of {len(numbers)} numbers:")
    print(f"Total: {total}")
    print(f"Average: {average:.2f}")
    print(f"Maximum: {maximum}")
    print(f"Minimum: {minimum}")

    print("\nNumber distribution:")
    for num in numbers:
        if num < average:
            print(f"{num} is below average")
        elif num > average:
            print(f"{num} is above average")
        else:
            print(f"{num} is equal to average")

if __name__ == "__main__":
    analyze_numbers()

このプログラムは、while ループ、for ループ、条件分岐、および例外処理の使用例を示しています。

ファイルを保存し(自動保存が有効になっています)、ターミナルで次のコマンドを使用して実行します。

python ~/project/number_analyzer.py

プロンプトが表示されたら数値をいくつか入力し、最後に 'done' と入力して分析結果を確認します。次のような出力が表示されるはずです。

Enter a number (or 'done' to finish): 10
Enter a number (or 'done' to finish): 20
Enter a number (or 'done' to finish): 30
Enter a number (or 'done' to finish): 40
Enter a number (or 'done' to finish): done

Analysis of 4 numbers:
Total: 100.0
Average: 25.00
Maximum: 40.0
Minimum: 10.0

Number distribution:
10.0 is below average
20.0 is below average
30.0 is above average
40.0 is above average

データの入力中に間違いをした場合は、プログラムを再度実行してください。これは、異なる入力値で Python スクリプトを繰り返し実行する良い練習になります。

まとめ

この実験では、Python の基本的な制御構造である条件分岐(if-else)、for ループ、および while ループについて学習しました。プログラムの流れを制御し、条件に基づいて意思決定を行い、データのシーケンスを反復処理する方法を習得しました。また、ネストされたループや、break や continue といったループ制御文の使用方法も実践しました。

これらの制御構造は Python プログラミングの骨格を成すものであり、より複雑で動的なプログラムを作成することを可能にします。これらの概念を組み合わせることで、ユーザーが入力した一連の数値を分析するような実用的なプログラムが作成できることを確認しました。

Python の学習を続ける中で、これらの制御構造は幅広いプログラミング上の問題を解決するために不可欠なものであると気づくでしょう。これらの概念を定期的に練習し、さまざまな組み合わせやユースケースを試して、理解をより確かなものにしてください。