たまたまプログラマになってしまった人, 熱心だが専門家では ... · 2020....
TRANSCRIPT
たまたまプログラマになってしまった人,
熱心だが専門家ではない人,
ちょっとかじっただけの人,
プロではないが毎日のようにコードを書いているすべての人に捧げる.
この本が,道を進む助けとなりますように.
実用的でないPythonプログラミング―楽しくコードを書いて賢くなろう!― Lee Vaughan 著・高島 亮祐訳
https://www.kyoritsu-pub.co.jp/bookdetail/9784320124615
はじめに
『実用的でない Python プログラミング』へようこそ! この本では,プログラミング言語の
Pythonを使い,火星や木星や銀河の最果てを,詩人の魂を,高度な金融の世界を,選挙の不正を,ゲームショーのトリックを,探っていく.マルコフ連鎖解析の技術を使って俳句を詠み,モ
ンテカルロシミュレーションで金融市場をモデル化し,イメージスタッキングで天体写真を改善
し,遺伝的アルゴリズムで巨大なネズミを育てる.それとともに pygame,Pylint,pydocstyle,tkinter,python-docx,matplotlib,pillow といったモジュールの経験を積むことができ
る.そして何よりも,楽しむことができる.
誰のための本か
この本は Python を学ぶ人が 2 冊目に読む本と位置づけることができる.完全な初心者向けの本や入門クラスのあとに続く本,あるいはそれらを補完する本となることを狙っている.これ
まで学んだことを一からやり直したり,つぎ込んだお金や本棚のスペースを無駄にしたりするこ
となく,プロジェクトベースのアプローチで独学を継続できる.独学だからといって放ったらか
したりもしないので,心配しないでほしい.すべてのコードに注釈や説明がついている.
この本の「プロジェクト」は,プログラミングを使って,実験したり,理論を検証したり,自
然をシミュレーションしたり,ただ楽しんだりするためのものだ.本書の対象読者には,プログ
ラマではないが仕事の一部でプログラミングを使っている科学者や技術者のような人も含まれる
し,「断固たる非専門家」と私が呼ぶ,娯楽としてプログラミングの問題を楽しむ素人や好事家
も含まれる.上に挙げたようなプロジェクトで遊んでみたいけど,複雑になりそうだとか,一か
ら始めるのは挫けそうだとか,時間がかかりそうだとか感じている人のために,この本がある.
この本にあるもの
本書のプロジェクトを進めるにつれて,Pythonの役に立つライブラリやモジュールについての知識が増える.ショートカットや,組み込み関数や,役に立つテクニックをたくさん学べる.
プログラムの設計やテストや効率化を実践できる.さらには,自分のやっていることを,実世界
での応用やデータや課題に結びつけることができる.
ラルフ・ワルド・エマーソンの言葉を借りると,「熱意なしに達成された偉業はない」.これは
学習についても当てはまる.この本の究極の目標は,読者の想像力に火をつけて,読者自身のプ
ロジェクトを進めていけるようにすることだ.最初は野心的すぎるように思えるかもしれない
が,心配しないでほしい.ちょっと頑張ってたくさんググれば,意外と早く奇跡を起こせるも
のだ.
この本にあるもの v
実用的でないPythonプログラミング―楽しくコードを書いて賢くなろう!― Lee Vaughan 著・高島 亮祐訳
https://www.kyoritsu-pub.co.jp/bookdetail/9784320124615
以下はこの本の各章の概要だ.必ずしも順番どおりに進める必要はないが,最初のほうに簡単
なプロジェクトがある.また,新しい概念やモジュールやテクニックは,最初に出たときに詳し
く説明するようにしている.
第 1 章:バカな名前ジェネレータ このウォームアッププロジェクトでは,Pythonのスタイルガイド PEP 8 と PEP 257 に加えて,その規約にどれだけ従っているかという適合度を分析するモジュール Pylint と pydocstyle を紹介する.最後にでき上がるのは,USAネットワークのテレビ番組『サイク』にインスパイアされた,マヌケな名前のジェネレー
タだ.
第 2 章:回文を見つける DCコミックスの魔術師ザターナを苦しい死から救いながら,自分のコードをプロファイリングする方法を学ぶ.ザターナが時間を巻き戻す悪役を倒すため
に必要な魔法の回文を,オンライン辞書で探す.
第 3 章:アナグラムを解く ユーザーが自分の名前のアナグラムを作るためのプログラムを
書く.たとえば,Clint Eastwood(クリント・イーストウッド)は old west action(古い西部劇)になる.次に,言葉をふるいにかけて,Tom Marvolo Riddle(トム・マールヴォロ・リドル)が自分のアナグラムである「I am Lord Voldemort」(私はヴォルデモート卿だ)を導き出すのを助ける.
第 4 章:南北戦争の暗号を解読する 歴史上最も成功した軍事暗号の 1 つであるユニオンルート暗号を調査・解読する.次に,両軍のスパイがジグザグのレールフェンス暗号で秘
密のメッセージを送信・解読するのを助ける.
第 5 章:清教徒革命の暗号の解読と生成 清教徒革命の null暗号を解読して,裸の文章に隠されたメッセージを読む.次に,null 暗号を作るという困難な仕事を実現するコードを設計・実装し,スコットランド女王メアリーの命を助ける.
第 6 章:見えないインクで書く 産業スパイのメッセージがシャーロック・ホームズの父に
気づかれないよう,見えないインクを使う.この章は,CBSのテレビドラマ『エレメンタリー』をもとにしている.
第 7 章:遺伝的アルゴリズムで巨大なネズミを育てる ダーウィンの進化論に着想を得た遺
伝的アルゴリズムを使って,ドブネズミを雌のブルマスティフくらい大きいスーパーラッ
トに育てる.また,ジェームズ・ボンドを助け,100億通りの可能な組み合わせがある金庫の鍵を,まばたきする間に破る.
第 8 章:俳句のために音節を数える 次の第 9 章で日本の俳句を詠むための準備として,英語の音節の数え方をコンピュータに教える.
第 9 章:マルコフ連鎖解析で俳句を詠む 第 8 章の音節を数えるモジュールとマルコフ連鎖解析を組み合わせ,さらに古来・現代の数百に及ぶ俳句を格納する訓練コーパスを用い
て,俳句の書き方をコンピュータに教える.
第 10 章:地球人は孤独なのか? フェルミのパラドックスを探る ドレークの等式,天の川
銀河の面積,検知できる「フェルミバブル」の大きさの推定値をもとに,異星からの電波
信号がないか調査する.有名な tkinterモジュールを学習・使用し,地球自身の電波バ
はじめにvi
実用的でないPythonプログラミング―楽しくコードを書いて賢くなろう!― Lee Vaughan 著・高島 亮祐訳
https://www.kyoritsu-pub.co.jp/bookdetail/9784320124615
ブルと銀河を図示する.
第 11 章:モンティ・ホール問題 世界一賢い女性,マリリン・ボス・サバントを助けて,モ
ンティ・ホール問題の議論に勝たせる.次に,オブジェクト指向プログラミング(OOP)を使って,楽しいグラフィカルユーザーインタフェースを備えた,モンティ・ホールゲー
ムを作る.
第 12 章:老後資金を守る モンテカルロ法による金融シミュレーションで,安心してリタイ
アできるように計画する.
第 13 章:異星の火山活動を再現する pygameを使って,木星の月の 1つであるイオの噴火をシミュレーションする.
第 14 章:マーズオービターを操縦する 人工衛星をつついて,途中で燃料が切れたり大気圏
で燃え尽きたりしないよう,うまく周回軌道に乗せるゲームを作る.重要な数値を表示し
たり,衛星の軌跡を描いたり,火星に影をつけたり,火星を自転させたりしながら,軌道
力学を学ぶ!
第 15 章:ぼやけた天体写真を精細化する Python の画像処理ライブラリを使って,低品質の動画をスタッキング(重ね合わせ)することで,木星の雲の帯と大赤斑を明瞭にする.
組み込みのモジュール os,shutilを使ってファイル,フォルダ,ディレクトリパスを扱
う方法も学ぶ.
第 16 章:ベンフォードの法則で不正を見つける ベンフォードの法則を使って,2016 年の大統領選挙で投票結果の改竄がなかったかを調査する.結果をまとめてグラフにするの
に,matplotlibを使う.
各章の最後には,「練習プロジェクト」や「挑戦プロジェクト」が少なくとも 1つある.それぞれの練習プロジェクトの解答は巻末にある.これは必ずしも最良の解答というわけではない.
もっといい解答を自分で見つけられるかもしれないので,のぞき見はしないように!
挑戦プロジェクトのほうは,全部自分でやらなくてはならない.1519年にコルテスがメキシコを侵略したとき,彼は船を焼き,後退という選択肢がないことを仲間に認識させた.彼らは,
冷酷で断固たる決意で,アステカ人に立ち向かったはずだ.それにより,「自分の舟を焼く」と
いう表現は,全身全霊をもって仕事に当たることを意味するようになった.挑戦プロジェクトに
は,舟を焼くように取り組まなくてはならない.そうすれば,各挑戦プロジェクトで,この本に
ある他のどの部分よりも多くのことを学べるだろう!
Python のバージョン,プラットフォーム,IDE
この本のプロジェクトは,いずれもMicrosoft Windows 10環境の Python v3.5で作られている.しかし,異なる OS(オペレーティングシステム)を使っていても問題はない.必要に応じて,他のプラットフォーム向けに互換性のあるモジュールを提案する.
この本に出てくるコード例とスクリーンショットは,Pythonの IDLEのテキストエディタか対話型シェルからとったものだ.IDLE は,統合開発学習環境(integrated development andleaning environment)のことだ.統合開発環境(IDE)に Lを足して,モンティ・パイソンで
この本にあるもの vii
実用的でないPythonプログラミング―楽しくコードを書いて賢くなろう!― Lee Vaughan 著・高島 亮祐訳
https://www.kyoritsu-pub.co.jp/bookdetail/9784320124615
有名なエリックアイドル(Eric Idle)と,同じ頭文字にしている.インタープリタとも呼ばれる対話型シェルは,コマンドを即座に実行して,ファイルを作らずにコードをテストできるウィン
ドウだ.
IDLEには,行番号が表示されないといった多くの欠点があるが,フリーで Pythonに付いてくるので,誰でも利用できる.どんな IDEでも好きなものを使えばいい.インターネットには,Geany(ジェニーと読む),PyCharm,PyScripterなど多くの選択肢がある.Geanyは Unix,macOS,Windowsなど幅広い OSで動作する.PyCharmは Linux,Windows,macOSで動作する.PyScripter が動作するのはWindows だ.利用可能な Python の開発ツールや互換プラットフォームの詳しいリストは,https://wiki.python.org/moin/DevelopmentTools/ で手に入る.
コード
この本には,すべてのプロジェクトのすべての行が載っており,可能なら自分の手で入力する
ことをお勧めする.ある大学教授が私に「手で学ぶ」と言ったことがある.コードを打ち込むこ
とで,起きていることに最大限の注意を払える,ということには同意せざるを得ない.
だが,もしプロジェクトを急いで終わらせる必要があるとか,間違ってすべて消してしまった
とかいうときには,練習プロジェクトの解答も含めたすべてのコードが,本書のウェブサイト
(https://www.nostarch.com/impracticalpython/)からダウンロードできる.このサイトには本書の正誤表も載っており,必要に応じて更新される.
コーディングスタイル
この本は問題解決についての本で,初心者が楽しめるものを目指している.だから時にはベス
トプラクティスから外れていたり,最高の効率性ではなかったりする.リスト内包表記や特別な
演算子を使うこともたまにあるが,たいていの場合は,学びやすいようにシンプルで分かりやす
いコードになっている.
この本の読者のような,プログラミングする非プログラマにとって,ものごとをシンプルに保
つことは大切だ.コードの多くは,特別な目的で 1, 2度使ったら捨てられる「クリネックスコード」だ.同僚と共有したり,人事異動で引き継ぐ破目になる類のコードなので,引き取りやす
く,分かりやすくなくてはならない.
主要なプロジェクトのコードにはすべて,単体で注釈や説明がついており,PEP(PythonEnhancement Proposal)8のスタイルガイドに概ね準拠している.PEP 8の詳細や,こうした規約に従うのに役立つソフトウェアは,第 1章にある.
助けてもらうには
プログラミングに挑戦するのは,何というか,挑戦的だ.コーディングは必ずしも直感的に理
解できるようなものではない.Pythonくらい親しみやすい言語でもそうだ.役に立つリンクや参考書を各章で提示していくが,自分自身で作り上げるプロジェクトでは,インターネットで検
索するのが一番だ.
はじめにviii
実用的でないPythonプログラミング―楽しくコードを書いて賢くなろう!― Lee Vaughan 著・高島 亮祐訳
https://www.kyoritsu-pub.co.jp/bookdetail/9784320124615
検索に成功するための鍵は,何を聞くべきかを知ることだ.これには最初イライラするかもし
れないが,「二十の質問」で遊んでいると思えばいい.答えを見つけるか,収穫逓減点に達する
まで,検索を重ねながらキーワードを磨いていく.
参考文献やインターネット検索による解決に失敗したら,次は誰かに聞く番だ.インター
ネットであれば,お金を払って,あるいは Stack Overflow(https://stackoverflow.com/)のようなフリーのフォーラムで聞くこともできる1).だが警告しておこう.こうしたサイト
のメンバーはバカな質問者に優しくない.投稿する前に「いい質問をするにはどうすべき
か」が書かれたページを必ず読むようにしよう.たとえば Stack Overflow であれば,https://stackoverflow.com/help/how-to-ask/というページがそうだ2).
前へ進め!
ここまで読んでくれてありがとう! 君がこの本からできるだけ多くを得ようとしていること
の証しであり,君はいいスタートを切ろうとしている.終わりまで読んだら,ずっと Pythonが得意になっていて,実世界の挑戦的な問題を解く準備ができているはずだ.それでは始めよう!
1) (訳注)日本語版は https://ja.stackoverflow.com/ja/2) (訳注)日本語版は https://ja.stackoverflow.com/ja/help/how-to-ask
前へ進め! ix
実用的でないPythonプログラミング―楽しくコードを書いて賢くなろう!― Lee Vaughan 著・高島 亮祐訳
https://www.kyoritsu-pub.co.jp/bookdetail/9784320124615