●
先回の続き。
●
4. ボックスサイズ
単位がセンチメートルの3つの引数をとり、体積を計算しリットルとして返す関数をかけ。
単位がセンチメートルの3つの引数をとり、体積を計算しリットルとして返す関数をかけ。
def problem4(cm1, cm2, cm3):
# 値チェックします。
cm = [cm1, cm2, cm3]
for c in cm:
if not (isinstance(c, int) or isinstance(c, float)):
print(f'引数はintかfloatにしてよー: {c}')
# Decimal化します。
import decimal
cm = map(lambda c: decimal.Decimal(str(c)), cm)
# 立方センチメートル出します。reduceってのはなんか配列を片っ端から処理してくれるやつ。
import functools
cubic_cm = functools.reduce(lambda x, y: x * y, cm)
# リットルに変換します。1000立方cm = 1.0リットル。
return cubic_cm / 1000
実行結果。
print(problem4(2.0, 2.0, 2.0), end='\n')
print(problem4(10.0, 10.0, 10.0), end='\n')
print(problem4(123.4, 123.4, 123.4), end='\n')
print(problem4(2, 2, 2), end='\n')
----------
0.008
1.000
1879.080904
0.008
先回知った Decimal を早速使っちゃったぜ。モジュールを使用しちゃうのはちとずっこい感じがしたんだけれど、問題2があまりに面倒だったからさ……。で、1個インポートしたら2個も3個も一緒でしょと functools も使っちゃったぜ。map関数も使っているし lambda にも慣れてきたぜ。
●
5. 最悪のFizzBuzz
最悪の - しかし動作する - FizzBuzzプログラムをかけ。
最悪の - しかし動作する - FizzBuzzプログラムをかけ。
こういうの大喜利みたいで楽しいね。ふたとおり作ってみた。
def problem5(start, end):
# ■ 最悪POINT 1: 変数名が日本語。ぞわっとするー!
結果リスト = []
# ■ 最悪POINT 2: 一回しか使わない変数をわざわざ作成してる。意味ねー!
end2 = end + 1
for i in range(start, end2):
# ■ 最悪POINT 3: 真偽用の変数を作るにしてもboolじゃなく文字列を使用してる。Falseにしとけー!
iは3の倍数です = 'いいえ'
iは5の倍数です = 'いいえ'
# ■ 最悪POINT 4: 3の倍数の求め方が「ずっと3を足していって該当したら」。頭わるそー!
three = 3
while True:
# ■ 最悪POINT 5: コードを見れば分かることをわざわざ説明するコメントを書いてる。意味ねー!
# threeがiと同じときiは3の倍数ですを'はい'にする。threeがiより大きくなっちゃったらwhileを終了。
if three == i:
iは3の倍数です = 'はい'
elif three > i:
break
# ■ 最悪POINT 6: three += 3 という書き方を知らない。知っとけー!
three = three + 3
# ■ 最悪POINT 7: 上と同じような処理なのに関数化してない。しとけー!
five = 5
while True:
if five == i:
iは5の倍数です = 'はい'
elif five > i:
break
# ■ 最悪POINT 8: って、+=知ってんのかよ! だったら上のも += 3 にしろよ!
five += 5
# ■ 最悪POINT 9: 無駄に ! を使ってる。この場合 == 'はい' にするべき。
if iは3の倍数です != 'いいえ':
if iは5の倍数です != 'いいえ':
結果リスト.append('FizzBuzz')
continue
# ■ 最悪POINT 10: このあたりは if elif でまとめればいいのにばらばらにifしてる。
if iは3の倍数です != 'いいえ':
結果リスト.append('Fizz')
continue
if iは5の倍数です != 'いいえ':
結果リスト.append('Buzz')
continue
# ■ 最悪POINT 11: ここまで処理が進むってことは絶対両方 'いいえ' なのにわざわざifに入れてる。意味ねー!
if iは5の倍数です == 'いいえ':
if iは3の倍数です == 'いいえ':
結果リスト.append(str(i))
# ■ 最悪POINT 12: for部が長すぎる!
結果の文字列 = ''
# ■ 最悪POINT 13: すごくダメな例外処理の使い方してる。で、出た〜〜w except pass 奴〜〜ww
try:
i = 0
while True:
結果の文字列 = 結果の文字列 + 結果リスト[i] + ','
i += 1
except:
pass
return 結果の文字列
「昔の俺が書いてたようなpython」がテーマだ。初心者あるあるを詰め込んだようなFizzbuzz。もう片方は逆に、いまの俺じゃないと書けないpython。
def problem5(start, end):
# ■ 最悪POINT: ワンラインで読みづらい(横長になりすぎないよう改行はしてる)。
return list(
map(
lambda i:
str(i)
if (i % 3 and i % 5)
else ('' if i % 3 else 'Fizz') + ('' if i % 5 else 'Buzz'),
range(start, end + 1))
)
最近覚えた高階関数や三項演算子をバリバリ使って一行Fizzbuzzを作ってみた。上のより高度ではあるけど、クッソ読みづらいから逆に最悪と言っていいんじゃね?実行結果。
print(problem5(1, 10), end='\n')
print(problem5(100, 110), end='\n')
print(problem5(1500, 1510), end='\n')
----------
1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,
Buzz,101,Fizz,103,104,FizzBuzz,106,107,Fizz,109,Buzz,
FizzBuzz,1501,1502,Fizz,1504,Buzz,Fizz,1507,1508,Fizz,Buzz,