B, F, G 合同セミナー (増田担当分ページ)

条件別処理と整数演算

実習の準備

niigata にログインして、 各自のホームディレクトリ (この授業用のディレクトリをつくっている人はそこ) に cd したうえで、 つぎのことをやってください。

「21_」などで始まり「.py」で終わるファイルがあるでしょう。


条件別処理 if-else

Python をふくむ 手順立て型 (これは増田の表現で、文献では「手続き型」となっていることが多い) の プログラム言語では、原則として、 プログラムに書かれた順に命令を実行していく「順次処理」がおこなわれます。

しかし、ある条件がなりたっているときといないときで別々の処理をしたいことがあります。

Python では、つぎの構文でこれを表現します。

if 条件:
    処理1
else:
    処理2

if は英語のif でよいでしょう。 else はふつうの英語ならば otherwise になるところですが、 だいたい同じ意味で短い else がつかわれています。

Python 特有の約束として、ifではじまる文やelseのあとには、コロンをうちます。 そして、右に段下げをします。 段下げのしかたはなんとおりかありますが、ひとつのプログラム内では一貫させます。 ここでは、空白を4個入れています。 (タブという特殊文字を入れる方法もありますが、 エディタでの操作で、タブといくつかの空白との区別がしにくいので、ここではさけます。)

「処理1」「処理2」のところには実行文を書きます。 改行して複数の実行文をならべることもできます。そのとき、段下げのレベルをそろえます。

「条件」のところには、論理型の式 (1つの変数でもよい) を書きます。 論理型とは、True と False の 2つの値だけをとる変数の型です。

変数に論理型の値を入れるには、True, False を代入するほかに、 比較演算の結果を入れる方法があります。

「==」 (イコール記号を2つつづける) が「等しい」、 「!=」 (exclamation mark のあとにイコール) が「等しくない」という意味です。 変数 a と b が同じ型ならば、「a == b」や「a != b」は True または False の値をとります。

a と b が数値型のばあいは、数値の大小の比較の演算子 「>」 「<」 「>=」 「<=」もつかえます。

p と q が論理型のばあい、論理演算「p and q」 「p or q」 「not p」がつかえます。 and, or, not をくみあわせるときは、演算の順序を確実にするために かっこ をつかいます。


多方面分岐の条件別処理 if-elif-else

条件が複数あるときは、if-else でつぎのように書けますが、段下げのレベルがふえてしまいます。

if 条件1:
    処理1
else:
    if 条件2:
        処理2
    else:
        処理3

else if をまとめた elif というキーワードがあり、これをつかうとレベルをふやさずにすみます。

if   条件1:
   処理1
elif 条件2:
   処理2
else:
   処理3

整数のわりざんのあまり

整数のわりざんの「あまり」を計算する演算子「%」があります。

たとえば、9 % 4 の結果は 1 になります。 (入力が負の数のばあいどうなるか、わたしはまだ確認していません。)


うるう年の判定

日付の実用的な計算には calendar あるいは datetime のパッケージを つかうことがすすめられるが、ここではわざと Python の基本的な機能からくみたててみる。

うるう年を英語では leap year という。 leap という論理型変数の値が、うるう年のばあいに真、そうでなければ偽になるように きめたうえで、 print で 判定結果を書きだすプログラムをつくってみる。

21 -- 24 のプログラムでは、 「西暦年が 4 でわりきれる年がうるう年である」という規則にしたがう。 これはユリウス暦の規則だが、 いまつかわれているグレゴリオ暦でも 1901 -- 2099 年にわたってなりたつ。

21, 22 のプログラムでは、leapの値をきめるところと書き出しで、 2回 if-else をつかっている。

21のプログラムでは、year の値は、プログラム中に書きこまれている。 他の年について計算するためには、プログラムを編集する必要がある。

22のプログラムでは、input 関数をつかって、キーボードから year の値を読むようにした。 input関数の () の中にはいる文字列はプロンプトにつかわれる。 input が返す値を int関数 によって整数値にしてから、「%」演算につかう。 キーボードから入れた文字列によっては、「整数に変換できない」というエラーになるかもしれない。

【1回のプログラム実行のうちで複数の年についてうるう年の判定をしたくなるが、 それにはループ処理をつかうので、今回は見送り、次回の課題にする。】

ここまでは年を西暦であたえるが、 23 のプログラムでは、日本の年号であたえるようにした。 「令和元年が西暦 2019 年である」という知識を 「year_seireki = year + (2019 - 1)」の形でとりこんでいる。 平成、昭和なども同様にできる。

24 のプログラムは (西暦にもどって)、 leap の値を、if-else をつかわずに、論理型の式として書いたものである。

気象の研究では、明治33年の観測値をつかうかもしれないし、 西暦2100年を想定した予測型シミュレーションの結果を見るかもしれない。 うるう年の判定の式の適用範囲をひろげるには、 グレゴリオ暦のうるう年の規則をきちんとプログラムにくみこむ必要がある。

グレゴリオ暦は、ローマカトリック教会では1582年10月15日から実施された。 国によって実施時期がちがう。イギリスでは1752年の途中からである。 (cal コマンドはアメリカ合衆国でつくられたので、 イギリスの公式の暦の変遷にしたがっている。)

25 のプログラムは、22のプログラムの leap の値をきめている部分を、 グレゴリオ暦の規則にしたがって、if-elif-else をつかって書いたものである。

26 のプログラムは、25と同じことを、elif をつかわないで書いたものである。 (段さげの階層が深くなるので、すすめられない。)

27 のプログラム (2024-05-21 のセミナー開始後に追加した) は、 グレゴリオ暦の規則を、24 と同様に論理型の式としてあたえるものである。 論理式は、数値の比較の演算の結果を 論理演算子 and, or でくみあわせたものになる。 論理演算子の実行順序を指定するために かっこ を (必要でないかもしれないが見やすいように) つかっている。


2024-05-21
増田 耕一 (MASUDA Kooiti)
増田の個人サイトでの [セミナー B, F, G 合同 (増田担当分)] [立正大学の授業用の教材ページ] [教材目録ページ] [日本語入り口ページ] [ホームページ]