息抜きがてらプログラミングサイトの問題を解いていたのですが, いちいちライブラリをインポートするのが面倒になったので, 簡単な処理はimportせずに書くことでpython力を上げていこうと思い,とりあえず3つだけメモ的に残そうと思います.
環境
- macOS Mojave 10.14.5
- Python 3.7.3
対象読者
- なんとなくライブラリを使いたくない人
切り下げ
色々方法調べたところ,math
ライブラリにfloor
なるものが存在するそうですが,タイトル通りインポートするのが面倒なので関数を適当に作ります.
>>> floor = lambda x: x//1
>>> floor(6.9)
6.0
>>> floor(6.1)
6.0
>>> floor(6.5)
6.0
関数にする必要あるか?という疑問はおいときます.
これはa//b
という演算はよくやると思いますが,aをbで割った時の商(整数まで)を返すのでそれを利用して,1で割って切り下げを行なっています.
好きな桁で切り下げがしたい時は以下のようにすればなんとかなります.
>>> floor = lambda x,y: x//y * y
>>> floor(1220,10)
1220
>>> floor(1222,10)
1220
>>> floor(1229,10)
1220
>>> floor(1229,100)
1200
>>> floor(1229,1000)
1000
切り上げ
こちらもmath
ライブラリにceil
なるものが存在するそうですが,以下同文です.
>>> ceil = lambda x: x//1 + bool(x%1)
>>> ceil(1.2)
2.0
>>> ceil(1.0)
1.0
>>> ceil(1.9)
2.0
>>> ceil(2.0)
2.0
ここではlambda
の説明は省きますが,その他を説明すると,切り下げ同様x//1
で商を計算しています.そしてx%1
はxをyで割った時の余りを返すので,bool()
でキャストしてあげることで余りが存在する時に1を足すことになります.
これで切り上げが実現できます.
応用編として好きな桁で切り上げは以下のようになります.
>>> ceil = lambda x,y: (x//y + bool(x%y)) * y
>>> ceil(1222.2,1)
1223.0
>>> ceil(1222.2,10)
1230.0
>>> ceil(1222.2,100)
1300.0
>>> ceil(1222.2,1000)
2000.0
四捨五入
調べたところroundという関数が用意されているようですが,これは偶数への丸めのようで以下のような挙動をします.
>>> round(2.4)
2
>>> round(2.5)
2
>>> round(2.6)
3
てことでこれも適当に関数作ってしまいましょう.
ここで注意事項ですが,下のやり方ではround関数の上書きを行なっています.本記事では既存のroundは不要かつ,わかりやすい関数名にするために上書きしましたが,一般的には推奨されないと思うのでこの方法を使用する際は,他の関数名にすることをオススメします.
>>> round = lambda x: x//1 + bool(x%1 >= 0.5)
>>> round(1.0)
1.0
>>> round(1.2)
1.0
>>> round(1.4)
1.0
>>> round(1.5)
2.0
>>> round(1.8)
2.0
>>> round(2.0)
2.0
>>> round(2.5)
3.0
好きな桁数で四捨五入したい時は以下のようになります.
>>> round = lambda x,y: (x//y + bool(x%y >= 0.5)) * y
>>> round(5555.5,1)
5556.0
>>> round(5555.5,10)
5560.0
>>> round(5555.5,100)
5600.0
>>> round(5555.5,1000)
6000.0
>>> round(5555.5,10000)
10000.0
まとめ
最近1つの関数を使うためだけにライブラリのインポートを行うことがよくあるので,これからはもっと自力でかけるように日々精進しようと思いながら,またこんなネタ記事レベルを錬成している今日この頃ですね( ̄∀ ̄)