.. toctree:: ================================= 4. if, elif, elseによる条件分岐 ================================= プログラムを実行すると、処理はファイルの1行目から順次実行されます。処 理を分岐させるめには、人間が指示する必要があります。「if」文は条件を与 えてプログラム処理の分岐を行います。複雑な分岐処理、「if」文に論理演算 子、elifやelseを組み合わせて行います。第4回講義の目的は以下の とおりです。 * if, elif, else文による条件分岐の文法を理解する。 * 条件式の書式や論理演算を理解する。 if文 ==== 「*if*」の後に 「*条件式*」 「 *:* 」とつづいて改行します。改行したら インデント(4スペース分)で処理をならべます。インデントが終わるところま でが、条件式を満たす時に処理される内容です。 .. code-block:: none if 条件式: 条件式がTrueの時に実行する処理をインデントしてならべる。 条件式がifが成立の時に行う処理1 条件式がifが成立の時に行う処理2 条件式がifが成立の時に行う処理3 . . . 通常処理 . . . 単語 **True** と **False** はpythonで特別な意味があります。条件式の判 定結果は、 **True** または **False** として得られます。以下の例からわか るように、条件式が成立していれば、 **True** を成立しなければ **False** が判定結果として得られます。 .. code-block:: python print(3 < 5) # True print(3 > 5) # False 条件式は以下のとおりです。注意点として整数の0は常にFalseになります。0以外 の整数、実数、文字列はすべてTrueです。 .. csv-table:: :header: "条件式", "意味", "成立(True)する条件" :widths: 20, 40, 40 "a == b", "aとbは等しいか?", "aとbは等しい時" "a != b", "aとbは異なるか?", "aとbは異なる時" "a > b", "aはbより大きい?", "aがbより大きい時" "a >= b", "aはb以上か?", "aはb以上の時" "a < b", "aはbより大きい?", "aがbより大きい時" "a <= b", "aはb以上か?", "aはb以上の時" "a", "aは0以外か?", "aが0以外の時、文字列0やxのような文字列もTrue" 例題として、与えた整数が偶数か奇数か判定するプログラムを作ってみます。 .. code-block:: python a = 8 # チェックする整数 amari = a % 2 # a/2のあまりを計算 if amari == 0: # 整数を2で割って余りが0なら偶数 print("{:d}は偶数".format(a)) # 偶数時の処理 もう一つ例題を示してみます。与えた文字列中に特定の文字が存在するか調 べてみます。 .. code-block:: python :caption: example-01 mojiretsu = "千葉市稲毛区" # 文字列の定義 flag = mojiretsu.find("稲毛") # findメソッドで文字列をチェック, flag=3 if flag > -1: # 0以上なら稲毛を含む print("{:s}は千葉を含む".format(mojiretsu), flag) 複数の条件を使って判定したい場合、論理演算(andとor)を使って条件を並べ ることができます。3つ以上の条件式も論理演算で並べることができます。 .. list-table:: :header-rows: 1 :widths: 20 40 40 :stub-columns: 0 * - 条件式 - 意味 - 成立(True)する条件 * - a == b and b > c - aはbと等しい **かつ** bはcより大きい - a=3, b=3, c=2の時など * - a == b or b > c - aはbと等しい **または** bはcより大きい - a=3, b=3, c=10の時やa=3, b=2, c=1 論理演算子の例題は以下のとおりです。与えた数字が2と7の公約数かどうか調べてみます。 .. code-block:: python :caption: example-02 a = 14 # チェックする整数 if a % 2 == 0 and a % 7 == 0: # 7でも2でも割りきれる print("{:d}は2と7の公約数".format(a)) # 偶数時の処理 文字列変数を使ったif文の例も示します。 .. code-block:: python :caption: example-03 mojiretsu = "稲毛千葉" # 文字列の定義 # 0以上なら稲毛を含む, -1なら千葉を含まない # どちらかの条件が成立すればTrue。両方成立してもTrue if mojiretsu.find("稲毛") > -1 or mojiretsu.find("千葉") == -1: print("\"{:s}\"は稲毛を含む、または千葉を含まない。".format(mojiretsu)) else文 ====== 条件式のTrueとFalseで、処理を分けたい場合、ifとelseを組み合わせて行い ます。条件式が成り立たない場合のみ、elseブロックの処理が実行されます。 .. code-block:: none if 条件式: 条件式1が成立するの時に実行する処理をインデントでならべる。 条件式が成立の時に行う処理1 条件式が成立の時に行う処理2 条件式が成立の時に行う処理3 . . . else: 条件式が成立しない時に行う処理1 条件式が成立しない時に行う処理2 条件式が成立しない時に行う処理3 . . . 通常処理 . . . elif文 ====== ifで分岐してさらに条件分岐を行いたい場合はelifで分岐します。処理は上か ら流れて進んでいくので、条件式1がTrueならばブロック1の処理、条件式1が Falseで条件式2がTrueならブロック2、条件式1がFalseで条件式2がFalseなら ばブロック3が実行されます。 Flase、条件式2もFalseの場合にだけelseブロッ クの処理が実行されます。 .. code-block:: none if 条件式1: 条件式1が成立するの時に実行する処理 (ブロック1) . . . elif 条件式2: 条件式1が成立しないで条件2が成立する時の処理 (ブロック2) . . . else: 条件式1も条件式2も成立しない時の処理 (ブロック3) . . . 通常処理 . . . ifのネスト ========== if文の中にif文を入れ子にして、条件分岐を多段にできます。ネストにすると インデントが増えて見づらくなります。elifや論理演算を使った方がすっきり するでしょう。時間hourを判定して時間帯によって言葉を選択するプログラム です。 .. code-block:: python :caption: example-04 :linenos: hour = 9 if hour <= 10: print("おはよう") else: if hour <= 12: print("もうすく昼ごはん") else: if hour <= 18: print("こんにちわ") else: if hour <= 22: print("こんばんわ") else: print("おやすみ") 次のように書いた方が直感的ですっきりします。 .. code-block:: python :caption: example-05 :linenos: hour = 13 if hour <= 10: print("おはよう") if 10 < hour and hour <= 12: print("もうすく昼ごはん") if 12 < hour and hour <= 18: print("こんにちは") if 18 < hour and hour <= 22: print("こんばんわ") if hour > 22: print("おやすみ") 1行if, else文による代入 ======================= ifとelseの処理ブロックの代入文が1行の場合、省略形でif, else文を書くことができます。 .. code-block:: python :caption: example-06 :linenos: a = 4 if a > 3: a = 3 # 代入文1行 else: a = 0 # 代入文1行 print(a) # a=0 1行でまとめてすっきり書くことができます。 .. code-block:: python :caption: example-07 :linenos: a = 2 a = 3 if a > 4 else 0 # aの値でaを更新する。 print(a) # a=0 inとnot in 演算子 ================= リストに要素が含まれるかどうか判定するために、in または not in 演算子 が使えます。 .. code-block:: python :caption: example-07 :linenos: v_list = [3, 4, 5, -2] print(3 in v_list) # True print(0 in v_list) # False if 3 in v_list: print("3を要素に含む。") if 0 not in v_list: print("3を要素を含まない。") 文字列も各文字からなるリストと考えれば、inで特定の文字を含むかどうか判 定できます。 .. code-block:: python :caption: exmaple-8 :linenos: s = "千葉大学工学部" t = "千葉" if t in s: # s.find(t) != -1 と同じ print("{}は{}を含む".format(s, t)) if文の例文まとめ ================ 最後に分岐や論理演算の例文をまとめて示します。 .. literalinclude:: example-01.py :caption: example-08 クイズ ====== Q1 -- 変数vの値をチェックして、30以上かどうか調べる。30以上ならvの値を表示する。 .. code-block:: python v = 10 # vの値を自分で変えてチェックする 答え .. code-block:: python :linenos: v = 30 if v >= 30: print("{}は30以上".format(v)) Q2 -- 変数vの値をチェックして、30以上で100未満かどうか調べる。30以上で100未 満ならvの値を表示し、違うなら\"違う\"と表示する。 .. code-block:: python v = 10 # vの値を自分で変えてチェックする 答え .. code-block:: python :linenos: v = 30 if 30 <= v and v < 100: print("{}は30以上で100未満".format(v)) else: print("違う") Q3 -- 変数sの値をチェックして、文字数が10文字ならsを表示する。 .. code-block:: python s = "hogehoge" # sの値を自分で変えてチェックする 答え .. code-block:: python :linenos: s = "hogehoge" if len(s) == 10: print(s) Q4 -- 変数sの値をチェックして、文字に\"ho\"が含まれるかどうか調べる。find()メソッドを使ってください。:ref:`文字列用のメソッド` .. code-block:: python s = "hogehoge" # sの値を自分で変えていろいろ調べる 答え .. code-block:: python :linenos: s = "hogehoge" if s.find("ho") != -1: print("hoが含まれる") else: print("hoが含まれない") Q5 -- リストの最大値要素が100以上かどうか調べる。100以上なら最大値を表示する。 .. code-block:: python l = [0.2, 3, 100, 32, 150] 答え .. code-block:: python :linenos: l = [0.2, 3, 100, 32, 150] if max(l) >= 100: print("最大値は", max(l)) Q6 -- 年齢を与えると、以下の料金表にしたがって入場料を表示するプログラムを作る。 .. csv-table:: :header-rows: 1 :widths: 20, 20 "年齢", "入場料金" "6歳以下", "100円" "7歳以上で20歳未満", "入場できない" "20歳以上で40歳未満", "500円" "40歳以上で60歳未満", "800円" "60歳以上", "1000円" 答え .. code-block:: python :linenos: year = 50 # 適当な年齢を入力する if year <= 6: print("料金は100円") if 7 <= year and year < 20: print("入場できない") if 20 <= year and year < 40: print("料金は500円") if 40 <= year and year < 60: print("料金は800円") if year >= 60: print("料金は1000円") Q7 -- 与えた整数を以下の条件で判定して、どの条件に合致するか結果を表示させる。 * 3の倍数であり、7の倍数である。 * 3の倍数であり、7の倍数でない。 * 3の倍数でなく、7の倍数である。 * 3の倍数でなく、7の倍数でもない。 答え .. literalinclude:: kadai-1.py Q8 -- 共生応用化学コースで筆記試験が免除で大学院に進学できる(推薦入学)条件は以下のとおり。 * 学籍番号は16Tで始まること。 * GPの順位が30番以内であること。 * TOEICの点数が580点以上であること。 * 140単位以上、取得していること。 以下の辞書データを持つ学生が推薦入学できるかどうか判定するプログラムを作り、その結果を名前付きで表示させる。 繰り返し処理は教えていないので、一人の学生データ毎にifやelseで分岐すれば良いです。 答え .. code-block:: python # 学生A student_a = {} student_a['名前'] = "千葉太郎" student_a['GP順位'] = 10 student_a['TOEICのscore'] = 590 student_a['取得単位数'] = 150 student_a['学籍番号'] = "16T9999X" # 学生B student_b = {} student_b['名前'] = "千葉花子" student_b['GP順位'] = 30 student_b['TOEICのscore'] = 570 student_b['取得単位数'] = 150 student_b['学籍番号'] = "15T9999X" .. literalinclude:: kadai-2.py Q9 -- if, elif, else, 論理演算子を使ったプログラムを自分で考えて作成する(何でも良いです)。 `ツェラーの公式 `_ の実装はどうでしょうか? 床関数はint()を使えば実装できます。 .. code-block:: python print(int(0.1) # 0 print(int(3.8) # 3 答え .. literalinclude:: kadai-3.py .. 講義後に追加 ============ 大窪がメモしたファイルを置いておきます。参考にしてください。 :download:`第5回講義メモ <2018-11-07/第5回講義メモ.pdf>` .. アンケートの統計 ---------------- .. image:: 2018-11-07/statistics.png :width: 800px :align: center