判断とループ
判断とループ
homepage
# 判断とループ 判断とループはコーディングで最も一般的な部分です。ソースコードを実行することにより、パソコンは判断できますし、繰り返し作業を行います。 このレッスンで、判断とループを習います。 ## 判断 判断は常に`if...else...`で実行します。ソースコードは以下の通りです。 ``` age = input('Input your name:') a = int(age) if a >= 20: print('You can drink alcohol') else: print('You cannot drink alcohol') ``` 実際に、`if`文のみを判断し、`else` 節で何も実行しない状況もあります。この場合、`else `節を使用するときに処理の記述が何もないとエラーになってしまいます。 このようなときに `pass `文を記述することでエラーを回避できます。 その他の場合、一つのことに複数ロジックを判断する可能性がありますので、`if...else...if...else...`で複数使用可能です。 Pythonで`elif`も使用できます。ソースコードは以下の通りです。 ``` score = input('Input your score:') s = int(score) if s >= 90: print('A class') elif 90 > s >= 80: print('B class') elif 80 > s >= 70: print('C class') elif 70 > s >= 60: print('D class') else: print('E class') ``` その他、`if`文の中にネスティング操作もできます。ソースコードは以下の通りです。 ``` age = input('Input your age:') a = int(age) gender = input('Input your gender') if gender == 'male': if a >=16: print('You are a man') else: print('You are a boy') else: if a >=16: print('You are a lady') else: print('You are a girl') ``` ### ロジック判断文 複数ロジックを判断する場合、論理演算子を使い、論理式を作ります。使用頻度が高い論理演算子は以下の通りです。 <style type="text/css"> .tg {border-collapse:collapse;border-spacing:0;} .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;} .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;} .tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top} </style> <table class="tg"> <tr> <th class="tg-0pky">論理演算子</th> <th class="tg-0pky">意味</th> </tr> <tr> <td class="tg-0pky">and</td> <td class="tg-0pky">“と”</td> </tr> <tr> <td class="tg-0pky">or</td> <td class="tg-0pky">“また”</td> </tr> <tr> <td class="tg-0pky">not</td> <td class="tg-0pky">“否定”</td> </tr> <tr> <td class="tg-0pky">is</td> <td class="tg-0pky">“同じ”</td> </tr> </table> 一つ注意点があります、`is`はオブジェクトが同じであるかどうかを判定する比較演算子 、`is` と` == `の動作と違います。 `==`ハオブジェクトの値が等しいかどうかを判定する比較演算子,次の例を参照してください: ``` a = 1001 b = 1001 c = a print(a is b) print(a == b) print(a is c) ``` 上のソースコードを実行すると、結果は`False` `True` `True`。前の話した変数のリセット値と編集の違うことを参考し、共通点を分析します。 ##ループ ループ文における、パソコンは自動的に繰り返して実行できます。Pythonのループ文処理はfor(トラバーサル式) や while (条件式)二種類があります。 これから説明します。 ###トラバーサル式(for) 複雑な経路で連結された複数の要素を順番に辿って情報を取得したり何らかの操作を行います。例えば: ``` # リスト"a"を作成して、五つint型データ「1,2,3,4,5」を格納します。 a = [1, 2, 3, 4, 5] #空のリスト"b"を作成して、内容を格納します。 b = list() # リスト"a"の要素にトラバーサルを行います。 for x in a: # xで自乗。 x = x * x # 計算結果はリスト"b"に格納します。 b.append(x) # bを出力し,結果を確認します。 print(b) ``` 前回の「データ型」レッスン言った通り、すべてのデータ型がトラバースできます。以下のループは`set`に対して処理です。 ``` # 新しいセット"s"を作成し、五つint型データ「1,2,3,4,5」を格納します。 s = {1, 2, 3, 4, 5} # 空のリスト"l"を作成し、内容を格納します。 l = list() #セット"s"の要素にトラバーサルを行います。 for x in s: # xで自乗。 x = x * x # 計算結果はリスト"l"に格納する。 l.append(x) # lを出力し,結果を確認します。 print(l) ``` 一つ注意点があります、出力対象は計算結果を格納ためのリストです。もし、ソースコードの後ろに一行を追加の上で、両方とも出力しましたら、 結果はどうですか、予想と同じですか、例えば ``` # リスト"a"を作成し、五つint型データ「1,2,3,4,5」を格納します。 a = [1, 2, 3, 4, 5] # 空のリスト"b"を作成し、内容を格納します。 b = list() # リスト"a"の要素にトラバーサルを行います。 for x in a: # xで自乗。 x = x * x # 計算結果はリスト"b"に格納する。 b.append(x) # bを出力し,結果を確認します。 print(b) # aを出力し,結果を確認します。 print(a) ``` aの出力結果は[1, 2, 3, 4, 5],リスト`a`自身の変更がありません。上記ループ処理中、 流れは以下のようになります。<br><br>  そのため、リスト`a`は変わらないです。 それでは、要素の値を変更しなければならない場合は、方法がないわけではないです。例えば、リストに対し、シーケンス番号を使用して、それぞれの要素を得ることができます。 Python中に、`range`と呼ばれるシーケンスを得ることができます。以下のソースコードの通りです。 ``` for i in range(10): print(i) ``` 出力結果は`0,1,2,3,4,5,6,7,8,9`。`range(10)`は0から9までのシーケンスが作成しました。 `range`を利用し、以下の方式で、シーケンスが指定されたリスト内の要素自分を、操作できます。 ``` # リスト"l"を作成し、五つint型データ「1,2,3,4,5」を格納します。 l = [1, 2, 3, 4, 5] # rangeを使用して、シーケンス番号に要素を指定します。注意!!len()はリストの長さを示します。 for i in range(len(l)): #第一要素は自乗結果とイコールように表示します。 l[i] = l[i] * l[i] # list lを出力し,結果を確認します。 print(l) ``` `range()`はforループ処理するときによく使われます、range()は 0からのオブジェクトを生成するではなくて、開始要素数, 終了要素数, ステップの第三引数まで指定出来ます。 関連内容については,公式ドキュメントを参照してください。 type勉強をする目的は、ソースコードを高効率的に読むことができます。 ###条件式循环(while循环) for文との違いとは、for文は別途指定したイテラブルなオブジェクトの要素の数だけ要素を第一要素から最後まで、1 つずつ取り出してながら繰り返しを行います。すべての要素か終わる時に処理を中断してforループを抜けます。 while文ではループ処理前に判断します。ある条件を満たす間`true`は繰り返し処理を行うが、ある条件を満たさない間`flase`場合は繰り返し処理を中断する。 以下のソースコードを参照して、while文使い方法を理解します。リスト`l`に、五つのint型データ「1,2,3,4,5」データを含みます。リストの最後から、要素を抽出します。 リスト`l`に空リストまで、要素を自乗して、結果はリスト`a`に格納します。 ``` # 新しいリスト"l"を作成し、五つint型データ「1,2,3,4,5」を格納します。 l = [1, 2, 3, 4, 5] # 空のリスト"a"を作成し、計算結果を格納します。 a = [] # リスト"l"が空かどうか判定します。 while l: #リスト"l"から要素を取り、Xを値渡します。 x = l.pop() # Xを値渡し、自乗します。 x = x * x # aにxを入れます。 a.append(x) # aを出力し,結果を確認します。 print(a) ``` `while`文はある条件を満たす間`True`の間、指定の処理を繰り返します。ただし、エラーが発生する場合、ループが終了です。 そのため、`while True`で繰り返し処理を行う際、条件により無限ループが発生する場合があります。例えば、プログラムを作成し、 フィボナッチ数列の次の項目を無制限に作成し、出力します。 ``` # x1初期値を設定します。 x1 = 1 # x2初期値を設定します。 x2 = 1 # ループ条件はTrue場合、無限ループが発生します。 while True: # x3はx1とx2の加算結果です。 x3 = x1 + x2 # x1とx2に値を渡します。 x1 = x2 x2 = x3 # x3を出力します。 print(x3) ``` ソースコードを実行時、大量な非常に大きな数字が連続して出力します。このようなループを使用している場合、これに注意しよう。 もし1000以内の数字を指定した場合、この条件はwhile判断句に追加できます。ソースコードは以下の通りです。 ``` # x1初期値を0に設定します 设定初始项x1为0 x1 = 0 # x2初期値を1に設定します x2 = 1 # x3初期値を0に設定します x3 = 0 # ループ条件は"<=1000" while x1 + x2 <= 1000: # x3はx1とx2の加算結果です x3 = x1 + x2 # x1とx2に値を渡します。 x1 = x2 x2 = x3 # x3を出力します。 print(x3) ``` for文とwhile文は違いが大きいですが、同じ機能実現するように、for文またはwhile文を使用することができます。 while文をfor文で書き換える例とfor文をwhile文で書き換える例を挙げてください。 ### pass和break ループ処理中、`if`文で条件を判定します。ある条件を満たさない場合に、何も処理しないです。または、ある条件を満たす場合、ループ処理が終わります。 この場合、`pass`文と`break`文が実現できます。 以下passの文例のよう、`pass`の使い方を習います。 飲み会で盛り上がるゲーム”3の倍数”、ルール、は時計回り、または反時計回りに、1から数字を呼びます。 ただし、もし、数字が3の倍数または3を含む場合(例えば、13,23, 35)、スキップして、次の数字から呼びます。 それでは、ソースコードが以下の通りです。 ``` # nを1に設定します、初期化 n = 1 # 実行条件が常にTrue(=真)であれば、指定の処理を永遠に繰り返す無限ループになります。 while True: # もしnが3の倍数なら、何もしない。 if not n%3: pass # もしnが3を含む場合、何もしない(文字列を使用原因を考えてください) elif '3' in str(n): pass # その以外,"n"を出力します。 else: print(n) # n = n + 1, 次のステップ n += 1 ``` そして、永遠に繰り返しないように、終止条件を追加します。そうでなければ、enterキーを押すと、大量な非常に大きな数字が連続して出力します。 この場合、`break`文を使用して、ループ処理を終了します。while文に条件を追加のは正しいですか、今回は`break`文で実現します。 例えば、以下の通、100まで出力します。 ``` # nを1に設定します、最初からやります。 n = 1 # 実行条件が常にTrue(=真)であれば、指定の処理を永遠に繰り返す無限ループになります。 while True: # もしn>= 100場合、処理終止。 if n > 100: break # もしnが3の倍数なら、何もしない。 elif not n%3: pass # もしnが3を含む場合、何もしない(文字列の使用原因を考えてください) elif '3' in str(n): pass # その以外,"n"を出力します。 else: print(n) # n = n + 1, 次のステップ n += 1 ``` ### continue `continue`文はループには、passとbreakより難しいと思います。 continue文を使うと、それ以降の処理が実行されずにスキップされ、次のループに進みます。以下のソースコードを例に挙げて説明します。 このコードのタスクは、0から1000までの連番を回して、もし17で割り切れる場合、二乗和計算を行います。結果を`list l`に格納します。 ``` # 結果格納用のリスト"l"を作成します。 l = list() # rangeを使用して、トラバーサル用の数列を作成します。(上界値は1001の原因を考えてください) for i in range(1, 1001): # iは17で割り切れるかを判断します。 if i % 17: # iは17で割り切れる場合、次のループを行います。 continue # それ以外の場合、数字を2乗して加算します。 else: # この操作を行う時、空のリスト"a"を定義し、数字を格納します。 a = list() # ループ文を使用して、すべての数字をトラバースします。(注意:ここは数値を文字列に変換する) for n in str(i): # 自乗計算結果を取得します。(注意:データタイプは数値に変換する) n = int(n) * int(n) # 二乗の計算結果をlist aに格納します。 a.append(n) # list a中にすべての数字を加算して、list l に格納します。(インデント位置を注意してください!ループには、入れ子ループ処理する時、階層構造を注意してください!) l.append(sum(a)) # list lを出力します。 print(l) ``` 上のタスクには、17回ごとに、数字処理を行います。それから、数字処理する時、listに格納しない場合、CPUが長時間実行されて、効率が低いです。 そのため、ループ処理前に、判定を行い、もし、数字は17で割り切れない場合、次のループに進み、CPU無駄な時間を削減します。
content
戻る