Python FizzBuzz問題をちょっとかじる
概要
関数の書き方がわかったので、Jupyter NotebookでFizzBuzz問題をちょっと感じてみましょう。
Fizz Buzz
まずは関数を使わずに単純に100回ループで都度print
で出力してみます。
%%time for i in range(1, 101): if (i%15 == 0): print('fizz buzz') elif (i%3 == 0): print('fizz') elif (i%5 == 0): print('buzz') else: print(i)
Jupyter Notebookでセルの実行時間を計測するには、%%time
を書いておけば大体の時間がわかるらしいです。より正確に計測したい場合は%%timeit
の方がいいみたい。
実行結果はこんな感じ。実行時間は9.09 ms。
1 2 fizz (中略...) 98 fizz buzz CPU times: user 7.01 ms, sys: 5.85 ms, total: 12.9 ms Wall time: 9.09 ms
では、関数にしてみましょう。
def fizzBuzz(i): if (i <= 0): return 'out of range.' if (i%15 == 0): return 'fizz buzz' elif (i%3 == 0): return 'fizz' elif (i%5 == 0): return 'buzz' else: return str(i) assert fizzBuzz(3) == 'fizz','fizzBuzzは3でfizzを返す' assert fizzBuzz(5) == 'buzz','fizzBuzzは5でbuzzを返す' assert fizzBuzz(15) == 'fizz buzz','fizzBuzzは15でfizz buzzを返す' assert fizzBuzz(4) == '4','fizzBuzzは4で4を返す' assert fizzBuzz(0) == 'out of range.', 'fizzBuzzは0でout of range.を返す' assert fizzBuzz(-1) == 'out of range.', 'fizzBuzzは-1でout of range.を返す'
Jupyter Notebookのセルはなるべく関数にした方がいいらしいので、アサートも書いておきます。
関数を呼び出しましょう。結果はリストに詰めて、カンマで結合することでprint
の実行は1回に抑えます。
%%time result = [] for i in range(1, 101): result.append(fizzBuzz(i)) print(','.join(result))
実行時間は360 µs。単位がマイクロ秒になりましたね!print
が遅いのは確定的に明らか。
1,2,fizz,(中略...),98,fizz,buzz CPU times: user 328 µs, sys: 29 µs, total: 357 µs Wall time: 360 µs
最初はインデントとコロンのスタイルが慣れなかったけど、最近気にならなくなってきた気がする。
人間すごい(語彙力)