Pythonと比較しながらClojureを学ぶ 〜 四足演算編

どうも、きっしゅです。

最近、現場で Clojure を書くことが多くなりました。

正直1つの言語をある程度やっていると他の言語も比較的簡単に習得できると思っていましたが、Clojure は思っていた以上に苦戦しています。

そこでしっかりと勉強をやり始めたわけですが、どうせなら自分がなじみのあるPythonと比較しながら勉強をしてもいいのではないかと思ってこのような記事を書いていくことにしました。

Python を忘れないようにするって目的もあります。笑

ということで今回は『四足演算』に関して書きます。

スポンサードリンク

Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学ぶオンライン講座

PythonとClojureの四足演算

プログラミングは見て学ぶよりも書いて学ぶ方がいいと思います。

もし Clojure の開発環境をまだ整えていない場合は下記の記事を参考に環境構築をしちゃってください!

では早速書いて比較していきます。

Pythonの四足演算

まず Python での書き方です。

# 足し算
print(1 + 1) # --> 2

# 引き算
print(10 - 2) # --> 8

# 掛け算
print(10 * 10) # --> 100

# 割り算
# 通常の除算
print(10 / 3) # --> 3.33333333...

# 割り算の整数値のみを出す
print(10 // 3) # --> 3

# 割り算の余りを出す
print(10 % 3) # --> 1

# 0での割り算
print(10 / 0) # --> ZeroDivisionError: division by zero

# べき乗
print(3 ** 3) # --> 27

見慣れた数式で直感的に書くことができます。

割り算に関しては書き方によって結果が異なるので注意したい部分ではあります。

Clojureの四足演算

続いて Clojure での書き方です。

;; 足し算
(+ 1 1) ;; => 2
(+ 1 1 1) ;; => 3

;; 引き算
(- 10 2) ;; => 8
(- 10 2 5) ;; => 3

;; 掛け算
(* 10 10) ;; => 100
(* 10 10 5) ;; => 500

;; 割り算
(/ 10 3) ;; => 10/3 (小数以下は出してくれない)
(/ 10 2) ;; => 5 (割り切れる場合は計算結果がでる)
(/ 10.0 3) ;; => 3.333333... (計算時にfloatを渡すと小数点以下も出力される)
(/ 100 2 5) ;; => 10

;; 0での割り算
(/ 100 0) ;; => Unhandled java.lang.ArithmeticException Devide by zero

;; 割り算の余りを求める
(rem 10 3) ;; => 1
(mod 10 3) ;; => 1

Python との違いを挙げると下記のようになります。

  • 引数を多数渡すことが可能
  • 割り算が少し特殊
  • べき乗はできない(Javaパッケージをインストールすればできる)
  • remとmodの動きが少し特殊

Clojure の場合はまずは演算子が前に来ます。そしてその後に計算したい数字をスペース区切りで渡していきます。

引数は何個でも渡すことができます。

そして注意したいのが割り算です。

整数の計算の場合、計算結果は分数の形で保存されます。分数の形は一般的に Ratio 型と呼ばれており、Clojure でもそれは同じです。

この Ratio 型のデータには大きなメリットがあります。

それは小数以下の数字を勝手に丸めないことです。

Float や Double 型の場合は小数以下の数字の桁数に制限があります。

なので管理できない分の小数以下の数字は丸められてしまいます。

その丸められた数字を管理して計算を継続すると計算結果に細かいズレが生じてしまいます。

ただ Ratio の場合はそもそも小数以下の数字を表現しないので勝手に丸められることはありません。だから自分が丸めたいタイミングまで数字を正確に管理することができます。

なのでプログラムを書いていても小数部分の計算結果がズレる可能性は格段に減ります。

この点は Python よりも Clojure が割り算に対して優れているって言える部分ではあると思います。

とは言っても Python では Ratio 型はないものの fractions という関数を使うことによって有理数計算をできるので心配の必要はありません。

ちなみにですが、Ratio 型を小数に戻す時は Clojure の float を使ったり、Java の Math を使ったりして小数に戻すことができます。

また割り算で少し特殊なのが余りを求める時に使う remmod です。これはマイナスの数字を扱うようになった瞬間に一気にややこしくなります。それは別記事にしようと思うのでこの場での説明は省略します。

まとめ

いかがでしたでしょうか?

同じ四足演算でも色々と違いがあることが分かったと思います。

とは言っても四足演算は四足演算なのでそこまで大きな戸惑いはないと思います。

皆様の快適な開発ライフの役に立ちますと幸いです。

Clojure Python
きっしゅをフォローする
Ibukish Lab+

コメント

タイトルとURLをコピーしました