1.21 jigowatts

Great Scott!

Python FizzBuzz問題をちょっとかじる

概要

関数の書き方がわかったので、Jupyter NotebookでFizzBuzz問題をちょっと感じてみましょう。

環境

macOS High Sierra バージョン 10.13.6
Python 3.7.0

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

f:id:sh_yoshida:20180811173331p:plain

では、関数にしてみましょう。

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のセルはなるべく関数にした方がいいらしいので、アサートも書いておきます。

f:id:sh_yoshida:20180811173915p:plain

関数を呼び出しましょう。結果はリストに詰めて、カンマで結合することで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

f:id:sh_yoshida:20180811174834p:plain

最初はインデントとコロンのスタイルが慣れなかったけど、最近気にならなくなってきた気がする。
人間すごい(語彙力)