29. ミニ演習#

以降の演習では実行方法を指定しません。Pythonインタプリタ、VSCode、その他、いずれに方法でもPythonでコードを書いて実行できるならば自由とします。

29.1. input関数の利用#

プログラム実行時にニックネームを受け取り、読み込んで利用するプログラムを作成してください。例えば當間が「naltoma」と入力したら、「naltomaさんですね。どうしましたか?」と返答するコードを書いてみましょう。

Hint

input関数を使うと、ユーザからのキーボード入力を読み込み、利用することができます。例えば次のコードを実行してみてください。

nickname = input('あなたのニックネームを教えて下さい => ')
print(nickname)

補足

  • input関数の引数は、そこで指定された文字列を出力してからユーザの入力を待ち、Enterキーが押下されるまでの文字列を読み込みます。読み込んだ文字列が戻り値となります。nickname = input() により、input関数の戻り値を変数nicknameに保存しています。


29.2. 2つの数字を入力として受け取り、その合計を表示するプログラムを作成してください。#

Hint

input関数を使うと、ユーザ入力を読み取ることができます。ただし読み取った値は全て str 型になります。このためそのままでは合計(数字として足し算)することができません。数字として扱いたい場合には、型変換をする必要があります。例えば次のコードを実行してみてください。

number1 = input('1つ目の数字を入力してください => ')
print(type(number1))
number1 = int(number1)
print(type(number1))

補足

  • 1行目はinput関数によりユーザ入力を読み込み、変数number1に保存しています。

  • 2行目は、変数number1に保存されている値の型をtype関数で確認し、その結果をprint関数で出力しています。

  • 3行目は、変数の中身の型をint関数によりint型に変換し、その値を変数number1に保存し直しています。なお、int関数で型変換できる数字は「半角数字の整数」です。全角数字、小数点を含む数字、漢字を含む数字等は変換に失敗してしまいます。

  • 4行目は、2行目同様です。しかし出力結果が違っている(2行目の時点ではstr型。4行目の時点ではint型)ことを確認しましょう。

Hint

input関数を使って「2つの数字」を受け取る方法は複数考えられます。ここではシンプルに「1回のinput関数で1つの数字を受け取る」方針で考えてみてください。例えば次のようになるでしょう。

number1 = input('1つ目の数字を入力してください => ')
number2 = input('2つ目の数字を入力してください => ')

29.3. 2つの数字を入力として受け取り、大きい方の数字を表示するプログラムを作成してください。#

ヒントなし。


29.4. リストの利用#

複数の整数を保存したリストを用意し、その順番通りに要素を表示するプログラムを作成してください。

Hint

リストとは「複数の要素」をまとめて保存しておくための型です。例えば次のコードを実行してみてください。

numbers = [10, 20, 30]
print(numbers[0])
print(numbers[1])
print(numbers[2])
print(numbers[3]) # IndexError

補足

  • 1行目は、1番目の要素が10、2番目の要素が20、3番目の要素が30のリストを用意し、それを変数numbersに保存しています。なおこの例では整数のみを扱っていますが、int, float, strといった他の型も混在して保存することができます。

  • 2行目は、「変数numbersの0番目」を出力しています。この0番目とは、1行目で用意した 10 を保存した場所を示しています。このように多くのプログラミング言語において順番を指定する際には 0番目 から数えることが多いです。またここでいう順番のことを index と呼びます。

    • 1行目のように [要素1, 要素2] という形式で書いた場合には「そういうリストを用意する」ように動作します。

    • 2行目のように 変数名[index]

  • 3行目と4行目は、0番目から数えた際の1番目と2番目を出力しています。

  • 5行目は、0番目から数えた際の3番目を指定しています。しかし変数numbersは3個の要素しか保存しておらず、index表記では numbers[2] までしか保存していません。このため numbers[3] のように存在しないインデックスを指定されると IndexError となります。


29.5. ループ処理の利用#

先程の例のように print(numbers[0]) という書き方では、リスト内の要素数が変わるたびにコードを修正する必要があります。しかしながら要素の数が変わるたびにコードを変更するのは手間がかかります。要素が5個の場合、10個の場合、100個の場合、、、それぞれ全て別のコードを用意するのは非現実的ですよね。そこで、ループ処理を使って順番通りに要素を表示するプログラムを作成してください。

Hint

リスト内の要素を順番通りに参照するには、上記のように直接 変数名[0], 変数名[1],,,のようにインデックス表記で指定することでも実現できます。しかしながら要素の数が変わるたびにコードを変更するのは手間がかかります。要素が5個の場合、10個の場合、100個の場合、、、それぞれ全て別のコードを用意するのは非現実的ですよね。このような状況を避けるためには「リスト内の要素を頭から最後まで一つずつ参照し、処理する」という書き方、すなわちループ処理が適しているでしょう。例えば次のコードを実行してみてください。

numbers = [10, 20, 30]
for item in numbers:
    print(item)
  • 1行目は、リストを用いて複数の要素を保存しました。

  • 2行目は、for文を使ってループ処理を指示しています。for, in, :の3つは命令文です。itemやnumbersは変数名です。このコード例では次のように動作します。

    • (1) 変数numbersに保存されている要素群に対し、一つずつ値を取り出して変数itemに保存する。

    • (2) その上でブロック内の処理を実行する。

      • ブロックとは、命令文の前にスペースを付けて揃えた命令群のことを指します。上記では1行のみですが、複数行の命令を単一ブロックとして書く(複数行をスペースで揃えて列挙する)ことができます。なお、ここでいうスペースはで揃えることをインデントと呼びます。

    • (3) ブロック内の処理を実行し終えたらfor文に戻り、次の要素を変数itemに保存して(2)を実行する。すべての要素を処理し終えたらブロックを抜ける。

  • 上記をより詳細に述べると次のようになります。

    • for文1回目: item = 10の状態でループ・ブロックを実行する。

    • for文2回目: item = 20の状態でループ・ブロックを実行する。

    • for文3回目: item = 30の状態でループ・ブロックを実行する。

    • for文4回目: 変数numbersにはこれ以上の要素が保存されていないので、ブロックを抜ける。


29.6. 複数の整数を保存したリストを受け取り、それらの要素の合計を表示するプログラムを作成してください。#

リスト内の要素数が固定されている場合、例えば3個保存されているとか決まっているなら result = numbers[0] + numbers[1] + numbers[2] のように合計を求めることができます。しかし先程のループ処理で話したように、リスト内の要素数は予め決まっているわけではなく、また決まっているとしても100個や200個の足し算をそれだけ書いて列挙するというのは手間がかかります。そこで「ループ処理を使い、要素数が変わったとしても同じ命令文で合計を求める」ことができるプログラムを作成してください。

Hint

さて、あなたはリストとループ処理を使えるようになったはずです。これらを用いて「要素の合計」を求めるにはどうしたら良いでしょうか。具体的なコードは後で考えるとして、処理の流れだけに着目して考えると例えば次のようにすると良いでしょうか。

  • 処理の流れ案

    • リスト内の0番目と1番目を足し合わせる。

    • その結果に2番目を足し合わせる。

    • これを要素が無くなるまで繰り返し、最後まで足し合わせた結果を出力する。

これに対し、ループ処理では「リストから要素を一つずつ取り出して処理する」ことができます。言い換えると一つずつ取り出して処理するように考え直す必要があります。上記の案では「1番目と2番目を足し合わせる」というように同時に2個取り出していますが、このような処理はそのままでは書くことができません。そこで「一つずつ取り出して処理する」ことを前提として、別の案を考えてみるとしましょう。

  • 処理の流れ案2

    • リスト内の0番目を取り出す。

    • これまでの結果に取り出した値を足し合わせる。

    • これを要素が無くなるまで繰り返す。

    • ブロックを抜けたら足し合わせた結果を出力する。

修正した案2では一部不自然に見える命令が出てきました。1行目はループ処理に入った直後で、これからブロックを処理しようとします。2行目の「これまでの結果」とは、合計した値を覚えておくための変数のことを便宜的にそう呼ぶことにしました。単純に「合計を保存しておく変数result」と書いたほうが理解しやすいかもしれません。最初の案ではこのように途中結果を保存しておく変数がありませんでしたが、プログラムの世界では後から参照しておきたい途中結果は全て変数に保存しておかないと覚えておくことができません。そのため「これまでの結果」という概念を利用しました。またこのようなループ処理における変数を用意するには一工夫が必要です。例として次のコードを実行してみてください。

numbers = [10, 20, 30]
result = 0
for item in numbers:
    result = result + item
    print(item, result) # 変数resultと変数itemを出力
print(result)
  • 1行目は、リストを用意しました。

  • 2行目は、合計を保存しておくための変数です。この時点ではまだ一度も足していないので、初期値として0を保存しておきました。

  • 3行目は、for文の始まりです。ループ1回目では10を変数itemに保存した状態でブロックを処理します。

  • ループ1回目

    • 4行目は、result + itemの結果を変数resultに保存しています。具体的には「0 + 10」を処理すると10になり、この値をresultに保存しています。なお、このように変数自身に四則演算する場合には result += item のように書くこともできます。

    • 5行目は、変数itemと変数resultを出力しています。動作確認しやすくするために書いた命令です。ループ1回目なら 10 10 と出力されるでしょう。この左側が変数itemの値、右側が変数resultの中身です。

      • ループ・ブロックはこの行で終わっています(6行目はインデントが異なるので、ブロックとみなさない)。この時点で3行目に戻り、次の要素をitemに保存した状態でブロックを処理します。

  • ループ2回目

    • 3行目は、20を変数itemに保存した状態でブロックを処理します。

    • 4行目は、これまでの結果を保存した変数resultに、itemを足し合わせて保存し直しています。具体的には result = 10 + 20 を実行するため、30が保存されることになります。

    • 5行目は出力しています。またブロックの最後に到達したので、3行目に戻り、次の要素をitemに保存した状態でブロックを処理します。

  • ループ3回目

    • 3行目は、30を変数itemに保存した状態でブロックを処理します。

    • 4行目は、これまでの結果を保存した変数resultに、itemを足し合わせて保存し直しています。具体的には result = 30 + 30 を実行するため、60が保存されることになります。

    • 5行目は出力しています。またブロックの最後に到達したので、3行目に戻り、次の要素をitemに保存した状態でブロックを処理しようとします。しかしもうリスト内には要素が残っていないため、ブロックを抜けます。

  • 6行目は、変数resultの中身を出力します。これが求めたかった合計値です。


29.7. 複数人の点数(100点満点)を保存したリストを受け取り、60点以上の人数と60点未満の人数を表示するプログラムを作成してください。#

例えば、

  • scores = [10, 100, 60, 80] の場合には、60点以上の人が3人、60点未満の人が1人と答えるようにしましょう。

  • scores = [0, 50, 30, 10, 50] の場合には、60点以上の人が0人、60点未満の人が5人と答えるようにしましょう。

ヒントなし。


29.8. ループの練習1。#

変数nの値(整数)が与えられたときに、*を使って簡易的な図形を表示するプログラムを作成してください。ただし、変数nの値(整数)に応じて出力が以下のように変化するものとします。

n = 1とした場合の出力

*

n = 2とした場合の出力。1行目は*を1個出力。2行目は*を2個出力。

*
**

n = 3とした場合の出力。1行目は*を1個出力。2行目は*を2個出力。3行目は*を3個出力。

*
**
***

n = 4とした場合の出力

*
**
***
****

Hint

リストに対してループ処理をするのではなく、「n回処理を繰り返す」場合には range関数 が便利です。例えば次のコードを実行してみてください。

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

補足

  • range(3) は、[0, 1, 2] という3つの要素を用意していることに相当します。このため、1回目のループでは変数iに0を保存した状態でループ・ブロックを実行することになります。詳細はrange関数ドキュメントを参照ください。


29.9. ループの練習2。#

変数nの値(整数)が与えられたときに、*とスペースを使って簡易的な図形を表示するプログラムを作成してください。ただし、変数nの値(整数)に応じて出力が以下のように変化するものとします。

n = 1とした場合の出力

*

n = 2とした場合の出力。1行目は「スペースを1個、*を1個、合計2個」出力。

 *
**

n = 3とした場合の出力。1行目は「スペースを2個、*を1個、合計3個」出力。2行目は「スペースを1個、*を2個、合計3個」出力。

  *
 **
***

n = 4とした場合の出力

   *
  **
 ***
****

29.10. ループの練習3。#

変数nの値(奇数)が与えられたときに、*とスペースを使って簡易的な図形を表示するプログラムを作成してください。ただし、変数nの値(整数)に応じて出力が以下のように変化するものとします。

n = 1とした場合の出力

*

n = 3とした場合の出力。1行目は「スペースを1個、*を1個、スペース1個、合計3個」出力。2行目は「*を3個」出力。

 * 
***

n = 5とした場合の出力。1行目は「スペースを2個、*を1個、スペース2個、合計5個」出力。2行目は「スペースを1個、*を3個、スペースを1個、合計5個」出力。3行目は「*を5個」出力。

  *  
 *** 
*****

n = 7とした場合の出力。1行目は「スペースを3個、*を1個、スペース3個、合計7個」出力。2行目は「スペースを2個、*を3個、スペースを2個、合計7個」出力。3行目は「スペースを1個、*を5個、スペースを1個、合計7個」出力。4行目は「*を7個」出力。

   *   
  ***  
 ***** 
*******