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
最初はインデントとコロンのスタイルが慣れなかったけど、最近気にならなくなってきた気がする。
人間すごい(語彙力)
Python フリーWiFiスポットを地図にプロットしてみる
概要
print
とリストとfor文あたりを触ってみたので、それっぽいことをしてみたくなりまして。オープンデータで検索していたら、FREE Wi-Fi & TOKYO スポット情報というのがあったので、この情報を使わせてもらってJupyter Notebookで地図にプロットしてみます。
準備
都が提供しているフリーWiFiなんすかね。
【東京都産業労働局】 外国人旅行者等が多く訪れる都立施設などにおいて無料で利用できる公衆無線LAN(Wi-Fi)サービス「FREE Wi-Fi & TOKYO」のスポット一覧です。
opendata-catalogue.metro.tokyo.jp
緯度・経度と住所などの情報が欲しいのでCSVをダウンロードして、Jupyter Notebookのディレクトリに配置しておきます。
CSVと地図にプロットするために以下のライブラリをインストールしました。
$ pip install pandas $ pip install folium
CSVファイルの読み込み
まずはデータを読み込んでみましょう。
import pandas as pd wifi_spots = pd.read_csv("FREE_WiFi_and_TOKYO.csv", encoding="shift-jis") wifi_spots.head()
え?これだけ?
地図にプロット
すべて上手く行っていますね。あとは地図にピンを刺すだけです。
import folium import pandas as pd wifi_spots = pd.read_csv("FREE_WiFi_and_TOKYO.csv", encoding="shift-jis") map = folium.Map(location=[35.6811673,139.7648629], zoom_start=11) for i, spot in wifi_spots.iterrows(): latitude = spot['緯度'] longitude = spot['経度'] popup = spot['拠点名']+ '<br />' + spot['住所'] folium.Marker(location=[latitude, longitude], popup=popup).add_to(map) map
folium.Map(location=[35.6811673,139.7648629], zoom_start=11)
で地図の中心地を指定できるっぽいので、東京駅の座標を設定。
拠点名と住所を改行したい場合、改行コードではダメだったのでタグで。
ちょっとやってる感が出てきましたね!
MacにPythonをインストールする
概要
夏だ!仕事だ!!Excelだ!!!
設計書作成のため日々Excelをこねくり回してます。コードは一行も書いていません。それが今年いっぱい続きます。ってことでPythonインストールします。
インストール
すでにインストール済みでした。デフォルトのバージョンが2でHomebrewでPython3を別途インストールした記憶があります。
$ python -V Python 2.7.10 $ python3 -V Python 3.6.1
調べていたらHomebrewのPythonがデフォルトでバージョン3になったとありました。
$ brew upgrade
これで行けるかと思ったのですが、
$ python -V Python 2.7.10 $ python3 -V Python 3.7.0
python
コマンドは以前のままですね。
インストールし直してもダメ。
$ brew uninstall --force python $ brew install python
調べてみたら同じような人が!
$ brew info python python: stable 3.7.0 (bottled), HEAD ... ==> Caveats Python has been installed as /usr/local/bin/python3 Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to `python3`, `python3-config`, `pip3` etc., respectively, have been installed into /usr/local/opt/python/libexec/bin ...
これだ!
.bash_profileにexport PATH=/usr/local/opt/python/libexec/bin:$PATH
を追記した結果、デフォルトでPython3になりましたね。
$ python -V Python 3.7.0 $ pip -V pip 18.0 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
Jupyter Notebook
Jupyter Notebookがいいと勧められたのでインストールします。
$ pip install jupyter
起動してみましょう。
$ mkdir jupyter-notebook $ cd jupyter-notebook/ $ jupyter notebook
これでPythonを始める準備が整ったはず。