PHPしか知らない僕がPythonを少し触ってみたよ 〜計算のできる男になる〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
今学生時代の数学のテスト受けたら何点取れるのかな?

この記事を三行にまとめると

PHPとPythonでそんなに大きな違いはないと思います
string型では数値計算できない
round()は四捨五入じゃない
今回は簡単な計算やら四捨五入やらをPHPとPythonでやってみたいと思います。これだけ押さえとけばきっと君も計算高い男、あるいは計算高い女になれる……はず。



四則演算

計算の基本はやはり四則演算。ということで簡単な足し算、引き算、掛け算、割り算をやってみませう。基本は一緒ですが注意しなきゃならない点もある。

//PHP
echo 1 + 1;//1
echo 1 - 1;//0
echo 1 * 1;//1
echo 1 / 1;//1

//Python
print(1 + 1)//2
print(1 - 1)//0
print(1 * 1)//1
print(1 / 1)//1.0

ここで気をつけたいのは割り算の出力結果ですね。PHPでは答えが整数の時、出力結果も整数ですが、Pythonの場合は「1.0」みたいに少数点以下の数字も表示されてしまいます。噂によればPython2では普通に整数で表示されてたみたいなのですが……すみません、僕はPython2は触ってないので確認はしてません。

割り算の結果を整数表示にしたい場合は計算結果を明示的に整数型に直すか、「//」とスラッシュを二つ使って割り算をすればオーケーです。

//整数型にする
print(int(1 / 1))

//ダブルスラッシュ
print(1 // 1)

これで両方とも「1」と表示されます。PHPにはない機能ですね、これは。PHPだとダブルスラッシュしたらコメントアウトしちゃうもんね。

ちなみにこれは小数点以下の0を省略できるという機能ではなく、小数点以下を切り捨てる機能になります。だから「5 // 2」なら2になるし「10 // 3」なら3になります。



型に注意

PHPの場合はstring型でも問題なく四則演算ができました。

echo '1' + '1';
echo '1' - '1';
echo '1' * '1';
echo '1' / '1';

でもPythonではそうはいきません。Pythonで上記のような書き方をするとstring型はダメよってエラーが出ます。

ただし足し算だけはエラーになりません。

print('1' + '1')//11
print('1' - '1')//エラー
print('1' * '1')//エラー
print('1' / '1')//エラー

PHPでは文字の連結には「.」を使いますが、Pythonでは「+」を使います。なのでstring型で足し算をすると、計算ではなく文字の連結が行われる。上記の場合は「11」になります。Javascriptとかと一緒ですね。

string型でも足し算だとエラーにならないと言いましたが、例えばこんなパターンだとエラーになる。

print('1' + 1)

こんな風に片方がstring型で片方がint型だったりすると、型を合わせろよデコ助ヤロウって怒られます。PHPやJavascritpだとエラーにならないので、慣れないうちはうっかりやっちゃうかも。僕はよくやってます。

//PHP
echo '1' + 1;//2

//Python
print('1' + 1)//エラー

//Javascript
alert('1' + 1);//11

もちろん変数でも同じです。型が合っていないとエラーになります。

i = '1'
j = 2
print(i + j)



インクリメント的な

PHPの「$i++」や「++$i」みたいなのはPythonにはないようです。おとなしく+1するしかないみたい。

i = 1
i = i + 1
i += 1



四捨五入

四捨五入をするにはround()という関数を使います。これはPHPもPythonも一緒なのですが、厳密にいうとPython3のround()は四捨五入ではないみたいです。

//PHP
round(0.5)//1

//Python
round(0.5)//0

0.4とか0.6なら問題ないのですが、0.5に関しては切り上げるか切り捨てるか、丸め方が一通りではないみたいです。最近接丸めとか最近接偶数丸めとかでググると詳しい情報が載ってるんでここでは触れませんが(ってか難しいことは分かんねー)、まあとにかく、Pythonでは0.5は1ではなく0になる。

じゃあ五捨六入かってーとそれもちょっと違うような感じで……例えば0.5は0になるし0.51は1になるけど、0.05を小数点第2位で丸めた場合は0.1になるのよね。

round(0.5)//0
round(0.51)//1
round(0.05, 1)//0.1

だから、うーん……四捨五入するものだって思っててコード書いてると思わぬ計算ミスにつながることがあるかもしれない。

PHPと同じようにround()で四捨五入したいなら、round()の関数を自作するのが良いみたいです。

def round(i, n = 0):
  return (i * (10 ** n) * 2 + 1) // 2 / (10 ** n)

print(round(0.5))//1
print(round(0.05,1))//0.1

関数の作り方についてはまた今度やりましょう。やっていることは、入力された数を2倍して1を足してまた2で割った数値を返してるみたいなことです。何か誕生日を当てる例のアレみたいな説明になっちゃいましたが、ようするにこの計算をやると0.4なら0.9になるし0.5なら1になるってことです。

(0.4 * 2 + 1) / 2 = 0.9
(0.5 * 2 + 1) / 2 = 1

2で割る時にダブルスラッシュを使うことで答えの整数部分だけを返すことができます。つまり0.9なら0が返るし1.0なら1が返るってすんぽーですね。

「10**n」ってのは10のn乗(10^n)のことです。小数点第何位かを四捨五入することになったとき用に入れてあります。ダブルスラッシュは整数を返してしまうので、例えば単純に0.05の小数点第2位を四捨五入したいって思っても、0.05をそのまま2倍して1を足して2で割ると0が返ってしまいます。なのでいったん0.05を10倍して0.5にしてから2倍して1を足して2で割った整数部分(1)を返した後に10分の1することで0.1を出力している感じです。

説明が下手ですみません。言葉で言われてもよく分からんって人は、とりあえずこれなら四捨五入ができるってことだけ理解していただければと。



切り上げと切り捨て

PHPの場合、切り上げと切り捨ては「ceil()」「floor()」でできます。

ceil(0.5)//1
floor(0.5)//0

Pythonでもこれは一緒なのですが、少し書き方が違う。

import math
math.ceil(0.5)
math.floor(0.5)

Pythonの場合、ceilやfloorを使うには「math」というモジュールを読み込む必要があります。「import math」ってのがそれ。たぶんですがmathというモジュールはPythonが使えるサーバーなら必ず入ってると思う。Pythonのドキュメントにもこのモジュールはいつでも使えますって書いてあったし。間違ってたらごめん。

ちなみにこんな書き方もできる。

from math import ceil, floor
ceil(0.5)
floor(0.5)

こっちの場合は「math.ceil()」とかではなく単に「ceil()」「floor()」と書きます。

fromやimportについては次回触れることにして、ここでは書き方だけ把握する感じでお願いします。



あまり

そういや余りを出すやつもありましたね。これはPHPとPythonで一緒です。

//PHP
echo 5 % 2;

//Python
print(5 % 2)






他にもいろいろあるような気がしますが、でもPHPとPythonでそんなに大きな違いはないと思います。PHPで数値計算に関するコードが書ければPythonでも問題なく書けるでしょう。

気をつけるポイントをまとめるとこんな感じですかね。

・string型では数値計算できない
・計算結果は答えが整数でも少数がついてくることがある
・mathをimportしろ
・round()は四捨五入じゃない

あれ、意外とあるな。



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください