ななぶろ

-お役立ち情報を気楽に紹介するブログ-

Pythonプログラミング:繰り返し処理の基礎と実践的な練習問題20選

www.amazon.co.jp

Pythonプログラミング:繰り返し処理の基礎と実践的な練習問題20選

Pythonにおける繰り返し処理は、コードの効率性と可読性を高める上で不可欠な要素です。このチュートリアルでは、初心者向けの練習問題を20問用意し、for ループ、while ループ、break 文、continue 文、リスト内包表記など、Pythonにおける繰り返し処理の基礎から応用までを網羅的に解説します。各問題にはヒントと詳細な解説が含まれており、読者の皆様が確実にスキルアップできるようサポートします。

はじめに

繰り返し処理は、プログラミングにおいて非常に重要な概念です。同じような処理を何度も繰り返す必要がある場合に、繰り返し処理を用いることで、コードの量を大幅に削減し、可読性を向上させることができます。Pythonには主にforループとwhileループという2種類の繰り返し構造があり、それぞれ異なる用途で利用されます。

  • Forループ: シーケンス(リスト、タプル、文字列など)やイテラブルオブジェクトの要素を順番に処理する場合に使用します。
  • Whileループ: ある条件が真である限り、ループ内のコードを繰り返し実行する場合に使用します。

このチュートリアルでは、これらの基本的な概念から始まり、break文やcontinue文といった制御構文、そしてPythonらしい簡潔な記述方法であるリスト内包表記についても解説していきます。

1. forループの基本:リストの要素へのアクセス

問題: 次のリスト fruits の各要素を出力してください。

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

ヒント: for ループを使って、リストの要素を一つずつ取り出し、print() 関数で出力します。

解説:

Pythonのforループは、シーケンス型のオブジェクト(リスト、タプル、文字列など)やイテラブルオブジェクトの要素を順番に処理するために使用されます。基本的な構文は以下の通りです。

for item in sequence:
    # 実行したいコード

この例では、fruits リストの各要素が順番に fruit 変数に代入され、ループ内の print(fruit) が実行されます。 これにより、リストの各要素がコンソールに出力されます。

英文: The for loop in Python is used to iterate over the elements of a sequence (list, tuple, string, etc.) or an iterable object. The basic syntax is as follows:

for item in sequence:
    # Code to be executed

2. range()関数:数値の繰り返し

問題: 1から10までの数字を順番に出力してください。

ヒント: range() 関数を使って、指定した範囲の数値を生成し、for ループで処理します。

解説:

range() 関数は、連続した整数のシーケンスを生成する関数です。 range(start, stop, step) のように引数を指定することで、開始値 (start)、終了値 (stop)、ステップ幅 (step) を制御できます。 stop は含まれないことに注意してください。

  • range(start): 開始値から始まり、1ずつ増加するシーケンスを生成します (デフォルトのステップ幅は 1)。
  • range(start, stop): 開始値から始まり、終了値の手前まで、1ずつ増加するシーケンスを生成します。
  • range(start, stop, step): 開始値から始まり、終了値の手前まで、指定されたステップ幅で増加するシーケンスを生成します。
for i in range(1, 11): # 1から10まで (11は含まない)
    print(i)

この例では、range(1, 11) が 1 から 10 までの数値を生成し、i 変数に順番に代入されます。 ループ内の print(i) は、現在の i の値を標準出力に出力します。

英文: The range() function in Python generates a sequence of numbers. It can take one, two, or three arguments: start, stop, and step.

  • range(start): Generates a sequence starting from start with a step of 1 (default).
  • range(start, stop): Generates a sequence starting from start up to but not including stop with a step of 1.
  • range(start, stop, step): Generates a sequence starting from start up to but not including stop with the specified step.

3. 文字列の繰り返し:文字ごとの処理

問題: 次の文字列 "Python" の各文字を出力してください。

ヒント: for ループを使って、文字列を一つずつ取り出し、print() 関数で出力します。

解説:

文字列もシーケンス型なので、for ループを使って文字ごとに処理できます。 文字列はイテラブルオブジェクトであり、各文字が順番にループ変数に代入されます。

word = "Python"
for char in word:
    print(char)

このコードでは、for char in word: が文字列 word の各文字を順番に char 変数に代入します。 print(char) は、現在の char の値を標準出力に出力します。

英文: Strings are also sequences in Python, so you can iterate over them using a for loop. Each character in the string is assigned to the loop variable in turn.

word = "Python"
for char in word:
    print(char)

4. whileループの基本:条件による繰り返し

問題: 以下の条件を満たすまで、1から5までの数字を順番に出力してください。

count = 1
while count <= 5:
    # ここにコードを記述
    count += 1

ヒント: while ループは、指定された条件が真である限り、ループ内のコードを繰り返し実行します。

解説:

while ループは、条件式が True である間、ループ内のコードブロックを実行し続けます。 条件式が False になると、ループは終了します。 while ループを使用する際には、ループを終了させるための条件を設定することが重要です。そうしないと、無限ループに陥る可能性があります。

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

この例では、count <= 5 が条件式です。 count が 5 以下である限り、ループ内の print(count)count += 1 が実行されます。 count += 1 は、count の値を 1 ずつ増加させる操作です。 count が 6 になると、条件式 count <= 5False になり、ループは終了します。

英文: The while loop in Python executes a block of code repeatedly as long as a given condition is true. It's crucial to ensure that the condition eventually becomes false to avoid an infinite loop.

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

5. break文:ループの早期終了

問題: 以下のリスト numbers から、偶数が出現したらループを終了してください。

numbers = [1, 2, 3, 4, 5, 6]
# ここにコードを記述

ヒント: break 文を使うと、ループの実行を強制的に終了できます。

解説:

break 文は、ループ(for ループまたは while ループ)の実行を直ちに中断し、ループから脱出するために使用されます。 break 文が実行されると、ループの残りの部分をスキップして、ループの外側のコードの次の行に進みます。

numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
    if number % 2 == 0:
        print("偶数が見つかりました:", number)
        break  # ループを終了
    print(number)

この例では、if number % 2 == 0: が偶数かどうかを判定します。 もし number が偶数であれば、メッセージを出力し、break 文によってループが終了します。 残りの要素は処理されず、ループは即座に終了します。

英文: The break statement is used to exit a loop prematurely. When encountered, the loop terminates immediately and execution continues with the next line of code after the loop.

numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
    if number % 2 == 0:
        print("偶数が見つかりました:", number)
        break  # ループを終了
    print(number)

6. continue文:現在のイテレーションのスキップ

問題: 以下のリスト numbers から、奇数だけ出力してください。

ヒント: continue 文を使うと、現在のイテレーションの残りの部分をスキップして、次のイテレーションに進むことができます。

解説:

continue 文は、ループ(for ループまたは while ループ)の実行中に、現在のイテレーションの残りのコードをスキップし、次のイテレーションを開始するために使用されます。 continue 文が実行されると、そのイテレーションの残りの部分をスキップして、ループの次の反復に進みます。

numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
    if number % 2 != 0:
        continue  # 現在のイテレーションをスキップ
    print(number)

この例では、if number % 2 != 0: が奇数かどうかを判定します。 もし number が奇数であれば、continue 文によって現在のイテレーションがスキップされ、次の数値に進みます。 したがって、奇数は出力されず、偶数だけが出力されます。

英文: The continue statement skips the rest of the current iteration in a loop and proceeds to the next iteration. It's useful for avoiding unnecessary code execution when certain conditions are met.

numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
    if number % 2 != 0:
        continue  # 現在のイテレーションをスキップ
    print(number)

7. ネストされたループ:二次元リストの処理

問題: 次の二次元リスト matrix の各要素を出力してください。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ヒント: ネストされたループ(ループの中に別のループ)を使って、二次元リストの行と列を順番に処理します。

解説:

ネストされたループは、あるループの中で別のループが実行される構造です。 二次元リストのような多次元データ構造を処理する場合によく使用されます。外側のループは行を反復処理し、内側のループはその行の要素を反復処理します。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for row in matrix:
    for element in row:
        print(element)

この例では、外側の for row in matrix: が二次元リストの各行を順番に処理します。 内側の for element in row: が、現在の行 (row) の各要素を順番に処理します。 これにより、すべての要素が順番に出力されます。

英文: Nested loops are used to iterate over multi-dimensional data structures like 2D lists. The outer loop iterates through the rows, and the inner loop iterates through the elements within each row.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for row in matrix:
    for element in row:
        print(element)

8. enumerate()関数:インデックスと要素の両方を取得

問題: 次のリスト colors の各要素とそのインデックスを出力してください。

colors = ["red", "green", "blue"]

ヒント: enumerate() 関数を使うと、リストの要素とそのインデックスを同時に取得できます。

解説:

enumerate() 関数は、イテラブルオブジェクト(リスト、タプルなど)を受け取り、各要素とそのインデックスを含むタプルのシーケンスを返します。 for i, color in enumerate(colors): のように使用することで、ループ内でインデックス i と要素 color を同時に取得できます。 これにより、要素だけでなくその位置も把握しながら処理を行うことができます。

colors = ["red", "green", "blue"]
for i, color in enumerate(colors):
    print("Index:", i, "Color:", color)

英文: The enumerate() function is a convenient way to iterate over a sequence while also keeping track of the index of each element. It returns pairs of (index, element).

colors = ["red", "green", "blue"]
for i, color in enumerate(colors):
    print("Index:", i, "Color:", color)

9. zip()関数:複数のリストを並行して処理

問題: 次のリスト namesages を組み合わせて、各人の名前と年齢を出力してください。

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]

ヒント: zip() 関数を使うと、複数のリストの要素を順番にペアにして処理できます。

解説:

zip() 関数は、複数のイテラブルオブジェクト(リスト、タプルなど)を受け取り、各イテラブルオブジェクトから対応する要素を取り出してタプルのシーケンスを返します。 for name, age in zip(names, ages): のように使用することで、ループ内で nameage を同時に取得できます。 これにより、関連するデータが別々のリストに格納されている場合でも、効率的に処理することができます。

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
for name, age in zip(names, ages):
    print(name, "is", age, "years old.")

英文: The zip() function allows you to iterate over multiple sequences simultaneously. It combines corresponding elements from each sequence into tuples.

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
for name, age in zip(names, ages):
    print(name, "is", age, "years old.")

10. リスト内包表記:簡潔なリストの生成

問題: 1から10までの偶数のリストを、リスト内包表記を使って作成してください。

ヒント: リスト内包表記は、リストを作成するための簡潔な方法です。

解説:

リスト内包表記は、既存のイテラブルオブジェクトに基づいて新しいリストを作成する構文です。 [expression for item in iterable if condition] のように記述することで、ループと条件式を1行で表現できます。 これにより、コードが簡潔になり、可読性が向上します。

even_numbers = [i for i in range(1, 11) if i % 2 == 0]
print(even_numbers)

この例では、range(1, 11) が 1 から 10 までの数値を生成し、if i % 2 == 0 が偶数かどうかを判定します。 もし i が偶数であれば、その値が新しいリストに追加されます。

英文: List comprehensions provide a concise way to create new lists based on existing iterables. They combine loops and conditional statements into a single line of code.

even_numbers = [i for i in range(1, 11) if i % 2 == 0]
print(even_numbers)

11. whileループとフラグ変数:複雑な条件の繰り返し

問題: ユーザーに数字を入力させ、正の数を入力するまで繰り返すプログラムを作成してください。

ヒント: フラグ変数を使い、入力が正の数であるかどうかを追跡します。

解説:

フラグ変数は、ループの制御や条件の判定に使用される変数です。 is_positive = True のように初期化し、条件に応じて値を変更することで、ループの実行を制御できます。 この例では、入力が正の数であるかどうかを示す is_positive フラグを使用しています。

number = 0
while number <= 0:
    try:
        number = int(input("正の数を入力してください: "))
        if number <= 0:
            print("正の数ではありません。もう一度入力してください。")
    except ValueError:
        print("無効な入力です。数字を入力してください。")

print("入力された数は:", number)

英文: Flag variables are used to track conditions within loops. They can be set to True or False and used to control the loop's execution based on certain criteria.

number = 0
while number <= 0:
    try:
        number = int(input("正の数を入力してください: "))
        if number <= 0:
            print("正の数ではありません。もう一度入力してください。")
    except ValueError:
        print("無効な入力です。数字を入力してください。")

print("入力された数は:", number)

12. forループと条件文:特定の要素の抽出

問題: 次のリスト numbers から、5より大きい数だけを新しいリストに格納してください。

numbers = [1, 3, 5, 7, 9, 2, 4, 6, 8]

ヒント: for ループと条件文を使って、各要素をチェックし、条件を満たす要素だけを新しいリストに追加します。

numbers = [1, 3, 5, 7, 9, 2, 4, 6, 8]
greater_than_five = []
for number in numbers:
    if number > 5:
        greater_than_five.append(number)

print(greater_than_five)

英文: You can use a for loop and an if statement to iterate through a list and extract elements that meet a specific condition.

numbers = [1, 3, 5, 7, 9, 2, 4, 6, 8]
greater_than_five = []
for number in numbers:
    if number > 5:
        greater_than_five.append(number)

print(greater_than_five)

13. whileループと入力:ユーザーからの連続的な入力

問題: ユーザーに数字を入力させ、"q" を入力するまで繰り返すプログラムを作成してください。 入力された数字の合計を表示してください。

ヒント: while ループを使って、ユーザーからの入力を繰り返し受け付けます。

total = 0
while True:
    user_input = input("数字を入力してください (qで終了): ")
    if user_input.lower() == "q":
        break
    try:
        number = int(user_input)
        total += number
    except ValueError:
        print("無効な入力です。数字を入力してください。")

print("合計:", total)

英文: A while loop can be used to continuously prompt the user for input until a specific condition is met (e.g., entering "q" to quit).

total = 0
while True:
    user_input = input("数字を入力してください (qで終了): ")
    if user_input.lower() == "q":
        break
    try:
        number = int(user_input)
        total += number
    except ValueError:
        print("無効な入力です。数字を入力してください。")

print("合計:", total)

14. リスト内包表記と条件文:複雑なリストの生成

問題: 1から20までの数の中から、3で割り切れない数だけをリストに格納してください。

ヒント: リスト内包表記と条件文を使って、簡潔にリストを作成します。

not_divisible_by_three = [i for i in range(1, 21) if i % 3 != 0]
print(not_divisible_by_three)

英文: List comprehensions can be combined with conditional statements to create lists based on complex criteria.

not_divisible_by_three = [i for i in range(1, 21) if i % 3 != 0]
print(not_divisible_by_three)

15. forループと文字列操作:文字列の分割と処理

問題: 次の文字列 "Hello, World!" をコンマで分割し、各単語を出力してください。

ヒント: split() メソッドを使って文字列を分割し、for ループで各単語を処理します。

text = "Hello, World!"
words = text.split(",")
for word in words:
    print(word)

英文: You can use the split() method to divide a string into a list of substrings based on a delimiter (e.g., comma). Then, you can iterate through the resulting list using a for loop.

text = "Hello, World!"
words = text.split(",")
for word in words:
    print(word)

16. whileループと辞書:キーの存在確認

問題: ユーザーにキーを入力させ、辞書にそのキーが存在するかどうかを確認するプログラムを作成してください。 存在しない場合は追加し、存在するならメッセージを表示してください。

ヒント: while ループを使って入力を繰り返し受け付け、in キーワードで辞書のキーの存在を確認します。

my_dict = {}
while True:
    key = input("キーを入力してください (終了するにはq): ")
    if key.lower() == "q":
        break
    if key in my_dict:
        print(f"キー '{key}' はすでに存在します。")
    else:
        my_dict[key] = 0  # 値は任意で構いません
        print(f"キー '{key}' を追加しました。")

print("最終的な辞書:", my_dict)

英文: You can use a while loop to repeatedly prompt the user for input and check if a key exists in a dictionary using the in keyword.

my_dict = {}
while True:
    key = input("キーを入力してください (終了するにはq): ")
    if key.lower() == "q":
        break
    if key in my_dict:
        print(f"キー '{key}' はすでに存在します。")
    else:
        my_dict[key] = 0  # 値は任意で構いません
        print(f"キー '{key}' を追加しました。")

print("最終的な辞書:", my_dict)

17. forループと関数:各要素に関数を適用

問題: 次のリスト numbers の各要素に対して、2倍にする関数を適用し、新しいリストを作成してください。

numbers = [1, 2, 3, 4, 5]
def double(x):
    return x * 2

ヒント: for ループを使って各要素を取り出し、関数に渡して結果を取得します。

numbers = [1, 2, 3, 4, 5]
def double(x):
    return x * 2
doubled_numbers = []
for number in numbers:
    doubled_numbers.append(double(number))

print(doubled_numbers)

英文: You can use a for loop to iterate through a list, apply a function to each element, and store the results in a new list.

numbers = [1, 2, 3, 4, 5]
def double(x):
    return x * 2
doubled_numbers = []
for number in numbers:
    doubled_numbers.append(double(number))

print(doubled_numbers)

18. リスト内包表記と関数:簡潔な関数の適用

問題: 上記の問題と同様に、リスト numbers の各要素に対して2倍にする関数を適用し、新しいリストを作成してください。ただし、リスト内包表記を使用してください。

numbers = [1, 2, 3, 4, 5]
def double(x):
    return x * 2
doubled_numbers = [double(number) for number in numbers]
print(doubled_numbers)

英文: List comprehensions provide a concise way to apply a function to each element of a list and create a new list with the results.

numbers = [1, 2, 3, 4, 5]
def double(x):
    return x * 2
doubled_numbers = [double(number) for number in numbers]
print(doubled_numbers)

19. whileループとファイル操作:ファイルの行の読み込み

問題: テキストファイルを読み込み、各行を出力するプログラムを作成してください。

ヒント: while ループを使って、ファイルから一行ずつ読み込みます。

try:
    with open("my_file.txt", "r") as file:
        line = file.readline()
        while line:
            print(line.strip())  # 改行文字を削除
            line = file.readline()
except FileNotFoundError:
    print("ファイルが見つかりません。")

英文: You can use a while loop to read a text file line by line. The readline() method reads a single line from the file, and the loop continues until there are no more lines to read. Remember to handle potential errors like FileNotFoundError.

try:
    with open("my_file.txt", "r") as file:
        line = file.readline()
        while line:
            print(line.strip())  # 改行文字を削除
            line = file.readline()
except FileNotFoundError:
    print("ファイルが見つかりません。")

20. forループと辞書:キーと値の反転

問題: 次の辞書のキーと値を反転した新しい辞書を作成してください。

my_dict = {"a": 1, "b": 2, "c": 3}

ヒント: for ループを使って、元の辞書のキーと値を取り出し、新しい辞書のキーと値として設定します。

my_dict = {"a": 1, "b": 2, "c": 3}
reversed_dict = {value: key for key, value in my_dict.items()}
print(reversed_dict)

英文: You can use a for loop and dictionary comprehension to reverse the keys and values of a dictionary. The .items() method returns a view object that displays a list of a dictionary's (key, value) tuple pairs.

my_dict = {"a": 1, "b": 2, "c": 3}
reversed_dict = {value: key for key, value in my_dict.items()}
print(reversed_dict)

よくある質問 (FAQ)

  • Q: for ループと while ループの使い分けは?

    • A: for ループは、リストや文字列などのシーケンスを反復処理する場合に適しています。事前に繰り返しの回数が決まっている場合に便利です。一方、while ループは、特定の条件が満たされるまで繰り返し実行する場合に使用します。繰り返しの回数が不明な場合や、ユーザーの入力に応じてループを制御したい場合に適しています。
  • Q: break 文と continue 文の違いは何ですか?

    • A: break 文は、ループ全体を強制的に終了させます。一方、continue 文は、現在のイテレーションをスキップして、次のイテレーションに進みます。
  • Q: リスト内包表記はどのような場合に役立ちますか?

    • A: リスト内包表記は、新しいリストを作成するための簡潔な方法です。既存のリストに基づいて新しいリストを作成する場合や、条件を満たす要素だけを抽出する場合に特に役立ちます。
  • Q: ファイル操作で with ステートメントを使うメリットは何ですか?

    • A: with ステートメントを使用すると、ファイルを開いた後、自動的にファイルを閉じることができます。これにより、リソースのリークを防ぎ、コードをより安全にします。
  • Q: 辞書のキーと値を反転させる方法はありますか?

    • A: はい、辞書内包表記を使うことで、簡単にキーと値を反転させることができます。{value: key for key, value in my_dict.items()} のように記述することで、新しい辞書を作成できます。

これらの練習問題と解説を通して、Pythonの繰り返し処理をマスターし、より高度なプログラミングに挑戦してください!