見出し画像

高校向けPython入門(4) 制御構造

高校向けPython入門(1) インストールと書法

高校向けPython入門(2) プログラムの書き方

高校向けPython入門(3) 変数と関数

 この中に「マニュアル」という言葉が出てくる。前回の「変数と関数」は,いろいろなプログラミング言語にほぼ共通な内容だが,ここからPython独自のものになっていく。たとえば,繰り返しの for 文は,最初は
  for i in range(10) で10回繰り返す 
でよいのだが,in や range() の意味を説明しようするとちょっとした分量になる。
生徒実習では上記の説明でよいだろうが,それでは「暗記」にとどまってしまうわけだ。そこで,「詳しいことはマニュアルに書かれているよ」ということになる。
 そのマニュアルは,現在,同時進行で作成中だが,その作成中のものを,サイト
          高校のためのPython教室
に置いてある。

==========================

4 制御構造

 プログラムは書かれた順に実行される。しかし,途中で同じようなことを繰り返したり, 条件によって処理内容を変えたりすることがある。こういった,実行する順序を制御するの が制御構造で,「繰り返し」と「条件分岐」がある。

4.1 繰り返し: for と while

 ある処理を繰り返すとき,決まった回数繰り返す場合は for ,条件が成り立つ間繰り返すときは while を使う。Python では,厳密には「決まった回数」ではないが,それについては適宜説明する。また,マニュアルに詳しく記載されている

4.1.1 for による繰り返し

 たとえば,1から 10 までの整数の和を計算することを考える。
 まず,合計を表す変数を wa として,初めは wa を 0 にしておく。
 変数 a の値を 1 から 10 まで増やしながら 「a の値を wa に加える」ということを繰り返す。

画像1

 ひとまずは,「for i in range(10): で 10 回繰り返す」という理解でよいだろう。
しかし,他のプログラミング言語で for 文を知っている人は,「in は何だろう」といった疑問が湧くかもしれない。
 実は,Python における for 文の構造は,他の言語とは異なり,次のようになっている。
           for 変数 in シーケンス
 「シーケンス」とは「一連の」とか「配列」という意味だ。数学なら数列。 つまり,データが並んだものの中から (in) 順に取り出して,変数に代入することを繰り返すのが,for 文の意味だ。
 renge(n) は,0 以上 n 未満の整数列を作る。range(10) なら 0,1,2,3,4,5,6,7,8,9 だ。したがって,i in range(10) は,i に 0 から順に値を代入しながら 10 回繰り返すことになる。
 また,この range() という関数は,range(a,b) とすると a 以上 b 未満の整数列を作り,range(a,b,step) とすると,step 値ずつ飛ばしながら a 以上 b 未満の整数列を作る。 次のようにコードを変えて,この意味を確かめよう。

画像2

画像3

 なお,「1 桁の奇数の和を求める」というのが目的ならば,上のようにやるより,次のよう に while を使う方がよい。range(1,11,2) より,処理の内容がわかりやすいからだ。

4.1.2 while による繰り返し

 ある条件を満たす間繰り返すには  while 条件 :  を使う。
 たとえば,「1 桁の奇数の和を求める」は「n = 1 から始めて,nが10 未満の間 ,nに2 を加えたものを足していく」と考える。

画像4

無限ループ

 while による繰り返しでは,条件が成り立つ間は永遠に繰り返すことになる。これを無限 ループという。ちょっとしたタイプミスによって無限ループに陥ることもある。その場合の対処法を一度やっておこう。次は,Jupyter Notebook の場合である。
 上のプログラムで,n に 2 を加えるのを忘れると,いつまでも n <10 のままなので無限 ループになる。
  実行すると,反応がなくなったように見えるが,図のように,セル番号のところが * になる。ずっと実行中ということだ。そこで,上の停止ボタンをクリックすると実行を 止めることができる。

画像5


 IDLE の場合は,Ctrl+C で停止する。

4.1.3 条件分岐 if

 ある条件が成り立つときだけ処理をおこなうには,if 条件 :  を使う。値を比較する条件として次のものが使われる。
  a==b : a と b が等しい(等号が2つであることに注意) 
  a!=b   : aとbが等しくない
  a>b  :aがbより大きい
  a<b  :aがbより小さい
  a>=b :aがb以上(>と=の順序に注意)
  a<=b :aがb以上
 たとえば,2 から 100 までの数のうち,偶数だが 4 の倍数ではない数の和を求める。
 4 の倍数は,4 で割った余りが 0 かどうかで判定できる。余りを求めるには,演算子 % を 使う。

画像6

「もし A が成り立てば P,そうでなければ Q」という条件分岐は,if と else を使う。
「もし A が成り立てば P,そうではなくもし B が成り立てば Q」の場合は,if と elif を 使う。
 たとえば,1 から 100 までの数のうち,3 の倍数,3 で割って 1 余る数,3 で割って 2 余る数のそれぞれの和を求める。

画像7

4.1.4 真偽値:True と False

 if や while での条件判断は,その式を「評価」して,真か偽かで分岐を行う。Python では,真は True,偽は False で表す。
 Python の制御構造には,「途中で抜ける:break」と,「以降の処理をせずに戻る:continue」という方法があるが,高校で扱う教材ではほとんど使うことがないので今は略す。詳細はマニュアルを参照されたい。

=== コラム ===========

制御構造とフローチャート

 情報の教科書には,プログラムの実行について「処理の流れは,順次,選択,反復という3つの要素を組み合わせて表すことができる」と書かれている。その横にフローチャートがある。フローチャートについては,文科省の学習指導要領解説にも「教えること」として記載がある。
 しかし,筆者は数年間,情報の授業でプログラミングを扱ってきたが,フローチャートの説明をしたことは一度もない。不要だからだ。
 1970年ごろ,コンピュータといえば,使う言語はアセンブラか,FORTAN,COBOLだった。コンピュータを作っているハードウェアが真空管から半導体に変わり,LSIで回路が組まれるようになって,個人でも使えるコンピュータが登場した。Altair である。当時はマイクロコンピュータと言われた。そのときの言語は,Altair BASIC。マイクロソフト社を起業したポール・アレンとビル・ゲイツが開発したものだ。 それが Microsoft BASIC となって,一時代を築いていく。
 1980年になると,パーソナルコンピュータが登場し,学校でも使われるようになった。月刊誌「NEW教育とコンピュータ(学研)」が創刊され,成績処理などのプログラムが掲載された。
 そのときの制御構造は今とは異なり,「GOTO 文で,プログラムのある箇所に飛ぶ」というものだった。どこに飛ぶのか,他の人が作ったプログラムは解析するのが大変だった。複雑に絡み合っていると,「スパゲッティプログラム」と呼ばれた。
 その頃に,ある意味必須だったのがフローチャートである。プログラムの流れを示す図だ。「GOSUB」というのもあって,サブルーチンに飛ぶのである。サブルーチンは今でいう関数だ。ある処理をそこで行うので副プログラムとも呼ばれた。サブルーチンから戻るには RETURN を使う。
 そのうち,GOTOをできるだけ排して,GOSUBで組み立てていく「構造化」がなされるようになり,プログラムの可読性(読みやすさ)は格段に増した。
 今でも,VBAには GoSub 文があるが,ほとんど使っていないだろう。「プログラムのある箇所に飛ぶ:GO」という考え方は今はないと思ってよい。
 Scratch という,子供向けの言語がある。マウスを使って,処理ブロックを並べていけばプログラミングができる。繰り返しも条件分岐もブロックになっている。その構造は,Python でも JavaScript でも,C言語でも同じだ。もはや「飛ぶ」という考え方は不要なのである。ということは,行き先を矢印で表すフローチャートも不要だということだ。
 教科書に載っていても,授業でフローチャートを書かせる必要はない。こういうものがある,という知識はあってもよいが,使う必要はない,というのが筆者の立場だが,ここは各自で考えられたい。

==================

次回は「リスト」