はじめに
hkob の雑記録の第471回目(連続44日目)は、今日のプログラミングIの授業で話した話題を記録しておきます。
本日のテーマ
今日の授業は条件分岐 (if, elif, else) を学ぶ内容でした。本コースではスクリプト言語として Python、コンパイル言語として Rust を学んでいます。Python はあくまでオブジェクト指向言語の一つとして学んでいるので、授業中にはさまざまな言語との違いなどを語っています。例えば調査課題3 では、何が True となり、何が False になるかを分別してもらいます。Python だと空に近いものは全て False になりますね。

この授業では、もし別の言語を学習する時には、ここは気をつけた方がいいという話題を話しています。条件判断はかなり言語で変化がある場所なので、話題にしました。特に Ruby だと nil や false 以外はほぼ全て true になるので、初学者はハマりがちですね。
irb(main):001> !!0 => true irb(main):002> !![] => true irb(main):003> !!{} => true irb(main):004> !!nil => false irb(main):005> !!false => false
あとは elseif, elsif, elif の違いですね。ここも言語ごとに異なるので注意が必要ですね。

最後の課題
最後の課題は3択の例として sign 関数を作成してもらいました。こちらは学生に配布しているテンプレートの一部です。こんな感じで Notion でテンプレートを配布しているので、該当する部分にコードを貼ってもらうだけにしています。書かれている場所が特定されるので、採点する教員も楽ができます。

実装は誰が書いても同じになるので、学生にはテストの値を自分たちで考えるように言っています。ちゃんと境界値のテストがされているのか、テストに抜けがないのかなどを確認します。友達の値をそのまま書き写すことのないように、一意の値になってなかったら減点するよと伝えています。
今回は if - elif - else を使うことという仕様にしたので、想定する回答はこんな感じになると思います。
def sign(x): if x > 0: return 1 elif x < 0: return -1 else: return 0
とはいうものの、実装自体も実はいろいろ書けるよねという話をしました。試しに return だけタイプしたところ、Copilot が以下のように保管してくれました。いかにも玄人が好みそうな数式です。ただ、これを理解するには int(True) が 1 になること、 int(False) が 0 になること、bool に対して加算などの演算をすると、暗黙の int への型変換が行われることを知らないといけません。条件分岐が行われないので、最近のコンピュータでも高速に処理ができますね。
def sign(x): return (x > 0) - (x < 0)
授業時間も余っていたので、この辺りの条件分岐に関わるような雑談をしまくっていました。
- 最近の CPU のパイプライン処理の話
- 分岐命令による投機的実行の話
- (私を含む)一部のプログラマはアルゴリズムによって条件判断が避けられるならそちらのコードを好んで記述する話
- 8ビットCPUの機械語でコード書いていた時代では、ループ展開した命令群の途中に JMP で飛んでくり返しを回避する技術は常套手段だった話
文法だけを学ぶだけの授業だと面白くないので、こういう雑談でこのあと学ぶコンピュータアーキテクチャなどの授業につながればいいなと感じています。
おわりに
授業後にこの辺りの話が好きな同僚と雑談し、富豪的プログラミングの話題に発展していきました。せっかくなら今日のブログのネタにどうですかと言われたので、まとめて書いてみました。たまにはこんなネタもいいですかね。
https://hkob.notion.site/hkob-16dd8e4e98ab807cbe3cf3cc94cdfe0f?pvs=4