RubyとPythonの構文〜分岐〜


はじめに

「Rubyしかできない奴はアルゴリズムがわからない馬鹿だ」というような記事を読んだり(どこで読んだか忘れました)
ペアプロでハッカソンしている中でアルゴリズム考えるの苦手という声をよく聞いたりします。

大学で取ったアルゴリズム論(眠かった)が初めて活かせるかもしれない!と思ったのでこれから色々分解していきたいと思います。

まずは使える構文の整理をしてみました。

この記事のゴール

・条件分岐の構文が使い分けられるようになる
・RubyとPythonのコードの違いがわかる

そもそも構文とは?

プログラムの基本的な命令の書き方のこと。

プログラムは3つの動きしかしません。

・順次処理:上から順番に実行される。基本はこの動き。
・分岐処理:条件によって処理を変える。心理テストみたいな動き。
・反復処理:同じ処理を繰り返す。ほっとくと無限に続いてしまうから何かの条件と組み合わせる。

これらの書き方のルールが構文です!

ちなみに、変数、定数、代入なども構文と言われることがあります。

条件分岐の構文

if

設定された条件によって実行する処理を変えます。条件に合わなかった時の処理も設定できます。
図にするとこう↓

条件を複数設定することもできます。

Rubyのif

if - elsif・・・else - end で記述します。

if.rb
if a == b 
 puts "aとbは等しい"
elsif a > b
 puts "aが大きい"
else
 puts "bが大きい"
end

Pythonのif

if - elif・・・else で記述します。

if.py
if a == b: 
 print("aとbは等しい")
elif a > b:
 print("aが大きい")
else:
 print("bが大きい")

ちなみに

if-endを複数並べるよりもif-elsif-else-endで実装した方が処理速度が早いらしいです。

unless

設定された条件に合わなかった時に処理を実行します。ifの反対です。

Rubyのunless

unless.rb
unless a = b 
 puts "aとbは等しくない"
end

elseも使えますが、処理を2つに分岐させたい場合は if-else を使う方が好ましいです。
「〜ではない時」を条件にしたい場合は否定演算子(!)を使います。

unlessOrIf.rb
unless a == b 
 puts "aとbは等しくない"
else
 puts "aとbは等しい"
end

#以下と同じ
if a != b
 puts "aとbは等しくない"
else
 puts "aとbは等しい"
end

#結局これでいい
if a == b
 puts "aとbは等しい"
else
 puts "aとbは等しくない"
end

elsifで複数の条件を設定することはできません。複雑な分岐になるときはif文を使いましょう。

じゃあいつunlessを使うの?

  1. 処理が一つで
  2. 否定条件の方がわかりやすい時

にunlessを使います。

unless.rb
unless year > 20 
 puts "お酒は買えません"
end

Pythonのunless

ないです!!が、if notという書き方ができます。

ifnot.rb
if not year > 20:
 print("お酒は買えません")

and,or,notの論理演算子を使って条件を設定できるみたいです。
詳しくはこちら

case(switch文)

何かの値によって複数の分岐をさせたい時はcaseがおすすめです。
ifだと条件式を分岐の回数分記述しないといけませんが、caseでは条件は1つで済むからです。
(Rubyカリキュラム「レビューアプリ」のinputの値によるメニューの分岐はcaseの方がシンプル!)

Rubyのcase

case.rb
case a
when 1
 puts "aは1"
when 2
 puts "aは2"
else
 puts "なんでもないよ"
end

ifの条件に==を使用し、複数の分岐を設定する時と動きは一緒です。

比較する値を2つ以上設定することもできます。

case.rb
case a
when 1,2
 puts "aは1か2"
when 3,4
 puts "aは3か4"
else
 puts "なんでもないよ"
end

Pythonのcase

ないです!!!!公式ドキュメントによると、

if... elif... elif... else の繰り返しで簡単に同じことができます。switch 文の構文に関する提案がいくつかありましたが、範囲判定をするべきか、あるいはどのようにするべきかについての合意は (まだ) 得られていません。

if-elif-elseで書いてくれだそうです。

ちなみに

ifとcaseの処理速度の差はほとんどないらしいです。JSの比較記事も誤差の範囲だった。

まとめ

今回調べていて、(当たり前かもしれませんが)以下のことがわかりました。

・言語によって使える構文が違う
・実装したい処理によって使うべき構文が違う

基本はif文で力技実装しかしないので、他の構文も使おうと思いました。
とはいえ処理速度が〜とかメモリ使用量が〜とかの根拠がないっぽいので、
使い分けはあくまで好みとか可読性なのかな?というのが今日の結論です。

反復まで書きたかった、、、。

追記

今度書きたい。
・そもそもアルゴリズムってなに?
・フローチャートってどう書くの?