Python 制御構文

English version.

Pythonには、プログラムの制御フローを制御するためのさまざまな制御構文があります。制御構文は、条件分岐や繰り返し処理などの構造で、プログラムの実行を柔軟に制御できるようにします。制御構文は、Pythonの文法の中核をなし、Pythonプログラミングにおいて非常に重要な役割を担っています。条件分岐や繰り返し処理は、プログラムの機能を拡張し、プログラムがより柔軟に動作できるようにするために必要です。このような制御構文を使用することで、Pythonプログラムはより高度な機能を提供し、複雑な処理を実行することができます。

条件分岐

条件分岐は、プログラムの実行フローを制御するために使用される、プログラミング言語の基本的な機能の1つです。条件分岐を使用することで、プログラムはある条件に応じて、異なるコードブロックを実行することができます。Pythonにおいて、条件分岐はif文、elif文、else文を使用して表現されます。ここでは、Pythonにおける条件分岐の概要と、それらを使用してコードを書く方法について説明します。

基本的な構文

if文の構文

以下は、Pythonのif文の構文です。

if 条件式1:
    # 条件式1がTrueの場合に実行する処理がTrueの場合に実行する処理

条件式1は、TrueまたはFalseを返す式です。条件式1Trueの場合、ifブロック内の文が実行されます。条件式1Falseの場合、ifブロック内の文はスキップされます。

if文とelse文の構文

以下は、Pythonのif文とelse文の構文です。

if 条件式1:
    # 条件式1がTrueの場合に実行する処理
else:
    # 条件式1がFalseの場合に実行する処理

条件式1は、TrueまたはFalseを返す式です。条件式1Trueの場合、ifブロック内の文が実行されます。条件式1Falseの場合、elseブロック内の文が実行されます。

if文、elif文、else文の構文

以下は、Pythonのif文、elif文、else文の構文です。

if 条件式1:
    # 条件式1がTrueの場合に実行する処理
elif 条件式2:
    # 条件式2がTrueの場合に実行する処理
else:
    # 条件式1と条件式2がFalseの場合に実行する処理

条件式1は、TrueまたはFalseを返す式です。条件式1Trueの場合、ifブロック内の文が実行されます。条件式1Falseの場合、次にelif文が評価されます。elifの後ろに続く条件式がTrueである場合、elifブロック内の文が実行されます。elifの条件式がすべてFalseである場合、最後にelseブロック内の文が実行されます。

条件分岐の例

以下は、条件分岐の例です。

x = 5

if x > 10:
    print("xは10より大きいです。")
elif x > 5:
    print("xは5より大きく、10以下です。")
else:
    print("xは5以下です。")

この例では、xが5であるため、elseブロック内の文が実行され、結果として「xは5以下です。」と出力されます。

注意

Pythonの条件分岐には、以下の点に注意する必要があります。

  • ifelifelseのいずれかが必要な場合、必ずしもすべてを使用する必要はありません。必要に応じて、必要な文だけを使用できます。
  • ifelifelseの条件は、先頭から順番に評価されます。最初に真である条件が見つかった時点で、対応するブロックの文が実行され、以降の条件は評価されません。
  • ifelifelseの条件式は、任意の複雑度の式にできます。複数の条件式を組み合わせることもできます。

複数の条件

複数の条件を使用した例を以下に示します。

x = 10
y = 5

if x > 5 and y > 3:
    print("Both conditions are true.")
else:
    print("At least one of the conditions is false.")

この例では、2つの条件が使用されています。x > 5y > 3の両方がTrueの場合、ifブロック内の文が実行されます。それ以外の場合、elseブロック内の文が実行されます。この例では、xは10であり、yは5であるため、両方の条件がTrueであり、結果として「Both conditions are true.」と出力されます。

また、or演算子を使用して、複数の条件式を組み合わせることもできます。以下は、or演算子を使用した例です。

x = 10
y = 5

if x > 5 or y > 10:
    print("At least one of the conditions is true.")
else:
    print("Both conditions are false.")

この例では、2つの条件が使用されています。x > 5またはy > 10の少なくとも1つがTrueの場合、ifブロック内の文が実行されます。それ以外の場合、elseブロック内の文が実行されます。この例では、xは10であり、yは5であるため、1つの条件(x > 5)がTrueであり、結果として「At least one of the conditions is true.」と出力されます。

条件分岐のネスト(入れ子)

以下は、入れ子の条件分岐の例です。

x = 10
y = 5

if x > 5:
    print("x is greater than 5.")

    if y > 3:
        print("y is greater than 3.")
    else:
        print("y is not greater than 3.")

else:
    print("x is not greater than 5.")

この例では、最初の条件分岐でxが5より大きい場合、最初のprint()文が実行され、その後にさらに条件分岐が行われます。この条件分岐では、yが3より大きい場合には2番目のprint()文が実行され、そうでなければ3番目のprint()文が実行されます。最初の条件分岐でxが5以下である場合、最後のprint()文が実行されます。

Pythonでは、入れ子の条件分岐を表現するためにインデントを使用します。インデントは、通常は4つの空白または1つのタブで行われます。Pythonは、インデントの大きさによってブロックを識別します。つまり、インデントの深さが同じ行は同じブロックに属し、深さが異なる場合は別のブロックに属します。インデントの深さが適切でない場合、PythonはIndentationErrorを発生させます。

注意点として、インデントには深さの違いがあるため、インデントを調整する際にスペースとタブを混在させるとエラーが発生することがあります。従って、スペースまたはタブのいずれかを使うことを推奨します。また、PEP 8というPythonのスタイルガイドでは、スペース4つを推奨しています。

繰り返し処理

プログラムでは、同じ処理を何度も繰り返す必要があります。このような場合に使用されるのが「繰り返し処理」です。Pythonには、for文やwhile文などの繰り返し処理を行うための制御構文があります。for文は、指定された回数や要素分、処理を繰り返すことができます。while文は、条件式が真である限り処理を繰り返します。繰り返し処理は、同じ処理を手動で何度も行う必要がなく、プログラムの効率性を向上させることができます。

for文

forループは、Pythonで頻繁に使用される反復処理の1つであり、ある範囲内の値を繰り返し処理するために使用されます。forループを使用すると、コードを短く、効率的に書くことができます。

以下は、Pythonのforループの基本的な構文です。

for variable in iterable:
    # code to execute
  • variableは、反復処理中に使用される変数名です。
  • iterableは、反復処理の対象となるオブジェクトです。例えば、文字列リストタプル、辞などが対象になります。

forループは、iterable内の各要素に対して、反復処理を行います。iterableには、range()関数を使用して数値範囲を指定することもできます。

以下は、forループを使用して、リスト内の値を反復処理する例です。

fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print(fruit)

この例では、fruitsリスト内の各要素が順番にfruit変数に代入され、print()関数を使用してそれぞれの値が表示されます。

while文

Pythonのwhile文は、指定された条件が真である間、一連の文を反復的に実行します。以下に、Pythonのwhile文について詳しく説明します。

以下は、Pythonのwhile文の構文です。

while condition:
    # 繰り返したい処理

conditionは、真偽値(TrueまたはFalse)を返す式です。Pythonは、conditionTrueである限り、whileブロック内の文を繰り返し実行します。

以下は、while文の簡単な例です。

i = 0

while i < 10:
    print(i)
    i += 1

この例では、iが0から始まり、10未満である限り、iを表示し、1ずつカウントアップします。

while文は、指定された条件が真である限り、反復的に実行されます。したがって、conditionが永久にTrueとなるような場合、while文は無限ループに陥る可能性があります。

無限ループに陥ってしまった場合は、CTRL+Zなどでプログラムを強制終了しましょう。

break文

breakは、Pythonの制御フロー文の1つで、反復処理(forループ、whileループなど)を途中で終了するために使用されます。break文が実行されると、現在のループの反復処理が直ちに停止し、ループから脱出します。

以下は、forループとbreak文を使用して、リスト内の要素を検索する例です。

fruits = ["apple", "banana", "cherry", "orange", "kiwi"]
search = "banana"

for fruit in fruits:

    if fruit == search:
        print(search + " found!")
        break

この例では、fruitsリスト内の各要素が順番にfruit変数に代入されます。ifステートメントで、fruitsearch変数の値に等しいかどうかを確認します。fruitsearch変数の値に等しい場合、break文が実行され、反復処理が終了します。それ以外の場合、次の要素が処理されます。もしsearch変数の値がfruitsリスト内に存在しない場合、forループが最後まで繰り返され、何も表示されません。

break文は、forループだけでなく、whileループでも使用できます。以下は、whileループとbreak文を使用して、入力された数値が正か負かを確認する例です。

while True:
    num = int(input("Enter a number: "))

    if num > 0:
        print("Positive number entered.")
        break

    else:
        print("Please enter a positive number.")

この例では、whileループが無限ループとして実行されます。ユーザーは数値を入力し、ifステートメントで、入力された数値が正の数かどうかを確認します。数値が正の数である場合、break文が実行され、ループから脱出します。それ以外の場合、ユーザーに再入力を促すメッセージが表示されます。

continue文

continueは、Pythonの制御フロー文の1つで、反復処理(forループ、whileループなど)の中で、現在の反復処理をスキップし、次の反復処理に進むために使用されます。

以下は、forループとcontinue文を使用して、リスト内の特定の要素をスキップする例です。

fruits = ["apple", "banana", "cherry", "orange", "kiwi"]

for fruit in fruits:
    if fruit == "banana":
        continue

    print(fruit)

この例では、fruitsリスト内の各要素が順番にfruit変数に代入されます。ifステートメントで、fruit"banana"であるかどうかを確認します。fruit"banana"である場合、continue文が実行され、現在の反復処理がスキップされ、次の反復処理に進みます。それ以外の場合、fruitの値が表示されます。

continue文は、forループだけでなく、whileループでも使用できます。以下は、whileループとcontinue文を使用して、1から10までの奇数のみを表示する例です。

i = 0

while i < 10:
    i += 1

    if i % 2 == 0:
        continue

    print(i)

この例では、i変数が0で初期化され、whileループが実行されます。i変数が1ずつ増加し、ifステートメントで、iが偶数であるかどうかを確認します。iが偶数である場合、continue文が実行され、現在の反復処理がスキップされ、次の反復処理に進みます。奇数の場合、iの値が表示されます。ループが10回実行されると、whileループが終了します。

else文

Pythonの繰り返し処理(forループ、whileループ)には、elseブロックを使用できます。elseブロックは、繰り返し処理が正常に完了した場合に実行されます。

以下は、forループとelseブロックを使用して、リスト内の要素を検索する例です。

fruits = ["apple", "banana", "cherry", "orange", "kiwi"]
search = "banana"

for fruit in fruits:

    if fruit == search:
        print(search + " found!")
        break

else:
    print(search + " not found.")

この例では、fruitsリスト内の各要素が順番にfruit変数に代入されます。ifステートメントで、fruitsearch変数の値に等しいかどうかを確認します。fruitsearch変数の値に等しい場合、break文が実行され、反復処理が終了します。それ以外の場合、次の要素が処理されます。もしsearch変数の値がfruitsリスト内に存在しない場合、forループが最後まで繰り返され、elseブロックが実行され、search変数の値が見つからなかったことを示すメッセージが表示されます。

elseブロックは、forループだけでなく、whileループでも使用できます。以下は、whileループとelseブロックを使用して、1から10までの偶数のみを表示する例です。

i = 0

while i < 10:
    i += 1

    if i % 2 == 1:
        continue

    print(i)

else:
    print("Loop completed.")

この例では、i変数が0で初期化され、whileループが実行されます。i変数が1ずつ増加し、ifステートメントで、iが奇数であるかどうかを確認します。iが奇数である場合、continue文が実行され、現在の反復処理がスキップされ、次の反復処理に進みます。偶数の場合、iの値が表示されます。ループが10回実行されると、elseブロックが実行され、ループが正常に完了したことを示すメッセージが表示されます。

range関数

Pythonの繰り返し処理(forループ、whileループ)で、一定の範囲内の数値の反復処理を行う場合、range()関数を使用することができます。range()関数は、指定された範囲の整数を生成するイテレータを作成します。

range()関数は3つの引数を取ります。

  • start:範囲の開始値
  • stop:範囲の終了値(この値は範囲に含まれません)
  • step:範囲内の数値の間隔(デフォルトは1)

以下は、range()関数を使用して1から5までの整数を表示する例です。

for i in range(1, 6):
    print(i)

この例では、range()関数によって、1から5までの整数を生成するイテレータが作成されます。forループで、イテレータから数値を1つずつ取得し、それぞれの値がi変数に代入されます。print()関数によって、i変数の値が表示されます。

range()関数を使用して、反復処理の間隔を変更することもできます。以下は、range()関数を使用して10から1まで2つおきにカウントダウンする例です。

for i in range(10, 0, -2):
    print(i)

この例では、range()関数によって、10から1までの整数を2つおきに生成するイテレータが作成されます。forループで、イテレータから数値を1つずつ取得し、それぞれの値がi変数に代入されます。print()関数によって、i変数の値が表示されます。

enumerate 関数

Pythonの繰り返し処理(forループ)で、反復処理中に要素のインデックスを取得する必要がある場合は、enumerate()関数を使用できます。enumerate()関数は、反復可能なオブジェクト(リストタプル文字列辞書など)とその要素のインデックスを返すイテレータを生成します。

enumerate()関数は2つの引数を取ります。

  • iterable:反復処理対象のオブジェクト
  • start:インデックスの開始値(デフォルトは0)

以下は、enumerate()関数を使用してリスト内の要素とそのインデックスを表示する例です。

fruits = ["apple", "banana", "cherry"]

for i, fruit in enumerate(fruits):
    print(i, fruit)

この例では、enumerate()関数によって、fruitsリスト内の要素とそのインデックスのイテレータが生成されます。forループで、イテレータからインデックスと要素を1つずつ取得し、それぞれの値がi変数とfruit変数に代入されます。print()関数によって、i変数とfruit変数の値が表示されます。

また、enumerate()関数を使用して、反復処理を開始するインデックスを指定することもできます。以下は、enumerate()関数を使用して1から始まるインデックスでリスト内の要素を表示する例です。

fruits = ["apple", "banana", "cherry"]

for i, fruit in enumerate(fruits, 1):
    print(i, fruit)

この例では、enumerate()関数によって、fruitsリスト内の要素と1から始まるインデックスのイテレータが生成されます。forループで、イテレータからインデックスと要素を1つずつ取得し、それぞれの値がi変数とfruit変数に代入されます。print()関数によって、i変数とfruit変数の値が表示されます。

reversed関数

Pythonの繰り返し処理(forループ)で、反復処理を逆順で行いたい場合は、reversed()関数を使用できます。reversed()関数は、反復可能なオブジェクト(リストタプル文字列など)を逆順に反復するイテレータを生成します。

以下は、reversed()関数を使用して文字列を逆順に表示する例です。

text = "Hello, World!"

for char in reversed(text):
    print(char)

この例では、reversed()関数によって、text文字列を逆順に反復するイテレータが生成されます。forループで、イテレータから文字を1つずつ取得し、char変数に代入されます。print()関数によって、char変数の値が表示されます。

また、reversed()関数はリストなどの反復可能なオブジェクトだけでなく、rangeオブジェクトを逆順に反復するためにも使用できます。以下は、reversed()関数を使用して10から1までカウントダウンする例です。

for i in reversed(range(1, 11)):
    print(i)

この例では、range()関数によって、1から10までの整数を生成するイテレータが作成されます。reversed()関数によって、イテレータを逆順に反復するイテレータが生成されます。forループで、イテレータから数値を1つずつ取得し、それぞれの値がi変数に代入されます。print()関数によって、i変数の値が表示されます。

繰り返し処理のネスト(入れ子)

Pythonの繰り返し処理(forループやwhileループ)では、繰り返し処理の中に別の繰り返し処理を組み込むことができます。このような構造を「繰り返し処理のネスト(nesting of loops)」と呼びます。ネストされた繰り返し処理を使用することで、より複雑な処理を行うことができます。

以下は、forループのネストによって九九表を表示する例です。

for i in range(1, 10):

    for j in range(1, 10):
        print(i * j, end="\t")

    print()

この例では、最初のforループが1から9までの整数を反復処理します。2番目のforループが1から9までの整数を反復処理します。print()関数によって、i * jの結果が表示されます。end="\t"は、タブ文字で出力されるように指定しています。内側のforループが完了した後に改行するために、最後のprint()関数が呼び出されます。

また、whileループのネストも同様に使用できます。

例外処理

Pythonでは、プログラム実行中に予期せぬエラーが発生した場合に例外が発生します。例外処理は、このようなエラーを捕捉して、プログラムの実行を続行するための仕組みです。例外処理を使用することで、プログラムがクラッシュすることなく、エラーに対処できます。

Pythonの例外処理には、tryexceptelse、およびfinallyのキーワードが使用されます。一般的な例外処理の構文は次のようになります。

try:
    # 例外が発生する可能性があるコード

except ExceptionType:
    # 例外が発生した場合に実行するコード

else:
    # 例外が発生しなかった場合に実行するコード

finally:
    # 例外の有無に関係なく、必ず実行されるコード

tryブロックは、例外が発生する可能性があるコードを含みます。exceptブロックは、例外が発生した場合に実行されるコードを指定します。elseブロックは、例外が発生しなかった場合に実行されるコードを指定します。finallyブロックは、例外の有無に関係なく必ず実行されるコードを指定します。

以下は、ゼロ除算によるZeroDivisionError例外をキャッチする例です。

try:
    x = 1 / 0

except ZeroDivisionError:
    print("ゼロ除算エラーが発生しました。")

この例では、tryブロック内でゼロ除算が行われますが、この操作は例外を発生させます。exceptブロックは、発生した例外がZeroDivisionErrorの場合に実行されます。print()関数によって、エラーメッセージが表示されます。

また、複数のexceptブロックを使用して、異なる種類の例外をキャッチすることもできます。以下は、ValueError例外とTypeError例外をキャッチする例です。

try:
    x = int("foo")

except ValueError:
    print("文字列を数値に変換できません。")

except TypeError:
    print("文字列以外のデータ型が指定されました。")

この例では、tryブロック内でint()関数が使用されますが、"foo"のような文字列は数値に変換できないため、ValueError例外が発生します。exceptブロックは、発生した例外がValueErrorまたはTypeErrorの場合に実行されます。print()関数によって、それぞれのエラーメッセージが表示されます。

また、exceptブロックには複数の例外を指定することもできます。以下は、ValueError例外とTypeError例外を同じexceptブロックでキャッチする例です。

try:
    x = int("foo")

except (ValueError, TypeError):
    print("数値に変換できませんでした。")

この例では、exceptブロックに複数の例外が指定されています。int()関数によって"foo"のような文字列が数値に変換できない場合、ValueError例外が発生します。また、int()関数に文字列以外のデータ型が指定された場合、TypeError例外が発生します。exceptブロックは、発生したいずれかの例外が指定された場合に実行されます。print()関数によって、エラーメッセージが表示されます。

例外処理は、プログラムが予期せぬエラーに遭遇したときにプログラムを安全に停止させることなく、エラーに対処するための強力なツールです。

Pythonを効率的に習得したい方へ

当サイトの情報を電子書籍用に読み易く整理したコンテンツを250円またはKindle Unlimited (読み放題) で提供中です。

プログラミング未経験の新入社員向けに利用している教材で、プログラミングの基本的な事項を中心に紹介しています。
オブジェクト指向や、Python特有のライブラリを利用した統計解析や機械学習といった事項は初期のプログラミング学習の観点からは難解であり、習得の障害となるために取り扱っておりません。
プログラミングやPythonの未経験者や学習に挫折したことのある方に特におすすめです。

体系的に学びたい方は是非ご検討ください。

本書はChatGPTの提示した内容を修正/調整して作成しています。

関連記事

Pythonの記事一覧

Python