プログラミング入門I
2024.11.11
if 文 その2
今回は形式的なミスが少なくてよかったのですが,それでも下記のように1件でてきたので,引き続き注意していきましょう. 解答用紙の番号と名前: b2463 以下は問題のあるプログラムの例です.参考にしてください.
if 33<=num1<=47 or 58<=num1<=64 or 123<=num1<=126 or 91<=num1<=96 :
print(f'{num2} is a symbol.')
elif 48<=num1<=57:
print(f'{num2} is a number.')
elif 65<=num1<=90:
print(f'{num2} is an upper case letter.')
else :
print(f'{num2} is a lower case letter.')
動作自体には問題ありませんが,インデントがだんだん増えて行ってます.同じ階層のものは同じインデントというのが理解しやすいので,このようなインデントは良くないです.
elif num2.isupper(): print(f"'{num2}' is a upper case letter.") |
母音の前の不定冠詞の誤用ですね.
elif 96 < num < 123: print(f'\'{ASCⅡ}\' is an lower case letter.') else: print(f'\'{ASCⅡ}\' is a upper case letter.') |
こちらも同じく不定冠詞の間違いないのですが,ご丁寧にも逆になっていて両方とも間違っています.
elif 97 <= n <= 122: print(f'\'{x}\' is a lower case number.') |
ちょっとした間違いなんでしょうが,間違いは間違いです.
num=random.randint(33,126) hex=(num) if 33<=(num)<=39: print(f"'{hex}' is a number.") elif 65<=(num)<=90: print(f"'{hex}' is an upper case letter.") elif 97<=(num)<=122: print(f"'{hex}' is a lower case letter.") else: print(f"'{hex}' is a symbol.") |
変数 hex は整数なので,当然結果は下のようになります.
'119' is a lower case letter. |
これを見ておかしいと気づきませんか?
elif rn>=65 and rn<=90: print(f"'{rn:c}' is a case letter.") |
これも大文字を表すために必要な upper がないもので,結果も下のように違和感のあるものになっています.
'B' is a case letter. |
if char in string.punctuation: category = '@' elif char in string.digits: category = 1 elif char in string.ascii_uppercase: category = 'M' elif char in string.ascii_lowercase: category = 'x' print(f"文字の種類: {category}") |
依然として出力結果の表示を勝手に書き換える人がいます.また,結果も意味のない表示となっているので,そこも良くないですね.
Student number: s****** 文字の種類: @ ------------------------ |
if '0' <= char <= '9': char_type = "a number" print(f"'{char}' is {char_type}.") elif 'A' <= char <= 'Z': char_type = "an upper case letter" print(f"'{char}' is {char_type}.") elif 'a' <= char <= 'z': char_type = "a lower case letter" print(f"'{char}' is {char_type}.") else: char_type = "a symbol" print(f"'{char}' is {char_type}.") |
スマートな処理を行っているのですが,よく見るとわかるように赤にハイライトした文はすべて同じなので,if 節の中に入れておく必要はありません.外に出せば1回書くだけでよいので,文字数が大幅に削減できます.
# 判定処理 if 33 <= random_code <= 47 or 58 <= random_code <= 64 or 91 <= random_code <= 96 or 123 <= random_code <= 126: category = "symbol" elif 48 <= random_code <= 57: category = "number" elif 65 <= random_code <= 90: category = "upper case letter" elif 97 <= random_code <= 122: category = "lower case letter" # 結果の表示 print(f"'{character}' is a {category}.") |
処理は間違っていませんが,一番ややこしい条件については else 節に押し込むのが楽ですし,間違いも起こりにくくなります.このような書き方をしている人は何人かいました.
if num <= 56: print(f'\'{num:c}\' is a symbol.') elif num <= 57: print(f'{num:c} is a number.') elif num <= 64: print(f'\'{num:c}\' is a symbol.') elif num <= 90: print(f'\'{num:c}\' is an upper case letter.') elif num <= 96: print(f'\'{num:c}\' is a symbol.') elif num <= 122: print(f'\'{num:c}\' is a lower case letter.') else: print(f'\'{num:c}\' is a symbol.') |
こちらの上の例も動作自体はいいのですが,今回複数個所に分散している記号をどうまとめるかが一つの鍵でした.else 節に入れる方が文字数が少なくて楽ですね.
if 48<num<57: print(f'{num:c} is a number.') elif 65<num<90: print(f'\'{num:c}\' is an upper case letter.') elif 97<num<122: print(f'\'{num:c}\' is a lower case letter.') else: print(f'\'{num:c}\' is a symbol.') |
'z' is a symbol. |
上のようなものも何例かありました.不等号だけの比較演算子を使用しているので,境界の数値をよく考える必要があります.実際に実行すると上のようにおかしな結果が出てきます.
if 33 <= num <= 47 or 58 <= num <= 64 or 91 <= num <= 96 or 123 <= num <= 126 : print(f"'{num:c}' is a symbol.") if 48 <= num <= 57 : print(f"{num:c} is a number.") if 65 <= num <= 90 : print(f"'{num:c}' is an upper case letter.") if 97 <= num <= 122 : print(f"'{num:c}' is a lower case letter.") |
前回強調しておいたif else を使うべき場合ですが,今回はそれに該当します.なので,上のような書き方は歓迎しません.ただ,出てきたのは1件だけだったので,それはそれでちょっと安心しました.
if 文について,基本的なことを学習しました.前回も紹介したツボの部分を再掲します.今回も引き続き if 文ですので,しっかりと理解していきましょう.
if 文のポイント
単純な if 文 | 条件式が真の場合に処理を行う |
if - else 文 | 条件式が真の場合にある処理を行い,偽の場合に別の処理を行う |
if - elif 文 | 条件式が真の場合にある処理を行い,偽の場合にはさらに別の条件式が真であれば別の処理を行う |
if 文の中にさらに if 文を入れることが可能です.そのような状態を 入れ子と言います.
if 文の条件式に従って実際に動作させる処理の文が複数になっても構いません.そのように複数の文が入る場合にそれらをスイート(組,ホテルのスイートルームのスイート)と言います.
if 文などのようにその効力が及ぶ範囲を明確に示す必要があるのが制御構造というもので,今後登場する for 文など重要な項目があります.その際に,スイートの範囲がどこまでかを示すのに,Python ではインデント(字下げ)を使用します.他の言語ではカッコを使用したり,ブロックの終了を示す文字列を入れたりしますが,Python では区切りの記号を使用しませんので,このインデントが非常に重要です.インデントが正しくないと実行時にエラーが出ますので,注意してください.
インデントの例
if hoge: Do this Do that |
上のようにスイートのインデントがそろっていない場合には,下図のようなエラーとなります.
一方で,以下のソースのような場合,各文のインデントがバラバラでもエラーとはなりません.ただし,見づらいので,決してこのような書き方を推奨はしません!
if hoge: Do this elif hege: Do that else: Do it |
教科書 p.70 List 3-31 で説明のある値の交換はとても便利な機能なので,この授業でも頻繁に使用することになると思います.活用してください.
教科書 p.72 の sorted 関数も便利な関数です.本来は複数の値を [ ] で囲むリストが登場したところ(教科書 p.164)で詳しく扱うものですが,今回ここで紹介されていますので,適宜使用してください.
リストとは複数の値(数値や文字列等)を一つの名前で管理できる便利なもので,通常は配列と呼ばれるものです.配列を使用できるようになると,実用的なプログラムを作成することが可能になりますが,残念ながらプログラミング入門IIの範囲です.
また,教科書 p.73 の代入演算子と代入式は今回は省略します.
他の言語では switch 文として用意されている機能とほぼ同じです.今回の授業では扱わないこととしますが,一応見ておいてください.
重要なことが網羅的にまとめてありますので,しっかりと読んでおいてください.
今回の演習問題です.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日11月18日の10:00です.レポート提出システムを使用します.
次回は教科書のp.90-101の範囲を学習しますので,予習をしてきてください.
また,次回はいよいよ第1回目の確認テストを行います.範囲は教科書の p.73 までです.復習をしっかりしておきましょう.