ホーム‎ > ‎

Pythonで遊ぼう

これは何?
Pythonの文法的な紹介は優れた公式チュートリアル(http://docs.python.jp/3/tutorial/)がありますので、詳細な解説はそちらを読んでいただくことにして、ここではそれを使って数学科っぽかったり現代っ子っぽかったりする使い方をコードを解説しつつ提案していきたいと思います。ただ、それ以前につまづきやすそうな環境構築だったり、プログラミングそのものについてもいくらか解説します。なんとなくで読んでもらうことを想定していますので、詳しいことが知りたくなったら先のチューリアルを読んでください。
また、過去のこの講義のPython講座はこちら(https://sites.google.com/a/utmsks.net/material/home/python2013)です。文法が解説されている上、興味深い演習問題もついています。
(実習とは全く関係ないけど、2017 年冬に放送された TV アニメ『小林さんちのメイドラゴン』で、小林さんの会社でプログラムされている言語は一貫して python でした (追記 by 高橋))
プログラミングについて
プログラミングは、コンピュータにやらせる命令を考えたり記述したりすることです。普通に表計算をしたりマインスイーパを遊んだりというときは、他人が書いたプログラム(コンピュータにやらせる命令列)を使えばいいのですが、自分しか使わないようなマイナーな単純作業は、自分で書くと自動化できて楽です。とはいっても、どんなことができるのかということがあまりピンとこないと思うので例えば列挙してみると、
  • 天気のサイトから過去の新潟の温度のデータだけを集めて表を作りたい。(いちいちデータをコピペしていたら大変!)
  • 辞書のテキストデータと暗記したい単語リストがあったときに、辞書のデータから暗記したい単語リストに載っているものだけを取り出して整形し、暗記カードを作って携帯に入れたい。
  • 教養学部のWebページから「お知らせ」のところを取り出して、新しいお知らせがあったときにそれをつぶやくTwitterボットを作りたい。
  • 「位数6の群を全て求めよ」と言われて、「そんなのかけ算表を全部埋めればできるだろうけど面倒くさいなあ」と思った。
  • IoTとかみんなが言ってるのでやってみたくなった。

などなど。今回は、その手の単純作業系の数学問題が集めてあるProject Eulerで遊ぶなかでプログラムを書く感覚を高めてもらえればと思います。

Python2とPython3

面倒な話なのですが、混乱を招きやすいので少し触れておこうと思います。興味がなければ、とりあえずこのページではPython3を使うということだけ注意してもらえれば飛ばして結構です。Pythonには2つのバージョンがあります。

Python2が広く使われていたのですが、いろいろと文字コードや関数の扱いなどで場当たり的な汚なさが出てきたので、互換性を切った、すなわち、以前Python2で書いたプログラムが動かなくなるようなバージョンアップをしたPython3が作られました。Python3のほうが綺麗なところも多いのですが、Python2で作られたプログラムをそのまま使いたい人も多くPython2のほうが情報が沢山出てきたり、プログラムに組み込んで使うためのプログラム(ライブラリといいます)がPython2にしか対応していなかったりして、Python2もPython3も両方使われているような微妙な状況です。今回はPython3を使ってみることにします。


インストール

Windowsの場合はhttps://www.python.org/downloads/release/python-351/の下のほうから「Windows x86 executable installer」を選んでダウンロードし、インストールしてください。(64bitのほうがお好みの方は自分で分かるでしょう。)よく分からないかもしれないですが、環境変数が変更されるはずなのでインストールした後は再起動してください。

Ubuntuの場合は、ありがたいことに始めからインストールされています(プリインストールされていると言ったりします)。端末を開いて、「python3」というコマンドで利用することができます。くれぐれも「python」と打たないように気をつけてください。思わぬ動作の違いに苦しむことになります。

書いたプログラムを実行する

Pythonの文法に従って書かれたプログラムを実行するには、それを解釈するプログラムに書いたプログラムを渡せば良いです。プログラムを書くには、いままでみなさんがシェルスクリプトやその他テキストファイルを書いてきたように、テキストエディタを使って書いてください。Pythonのプログラムは.pyという拡張子を持たせる約束になっています。例えば「Hello, world!」という文字列を表示するだけのプログラムである「hello.py」というPythonプログラムを作ってみます。

テキストエディタで「print("Hello, world!")」とだけ入力し、それを適当な場所に保存しましょう。例えばホームの「python」に「hello.py」という名前で保存したとすると、このファイルのパスは「~/python/hello.py」となります。

さっき書いた1行だけのプログラムはPythonの文法に則って書いたPythonプログラムですので、実行することができます。実行するには、「$ python3 hello.py」と、pythonコマンドに先のpythonプログラムを渡しましょう。当たり前ですが、保存した場所が「~/python/」なら、はじめに「cd python」と打ってワーキングディレクトリを変更してから渡すか、「$ python3 python/hello.py」とパスを正確に指定するかしてください。すると、「Hello, world!」という文字列が表示されて、プログラムが正常に実行されたことが確認できると思います。

他のことをするプログラムを書きたいときも、同様に、

  1. プログラムをテキストエディタで書いて保存する。
  2. 1で書いたプログラムをpython3に渡して実行する。
という流れでやってみてください。

Project Eulerについて

とはいっても始めは何を書いていいかよく分からないと思うので、プログラミングを使ったパズルゲームで遊んでみることにしましょう。Project Euler(https://projecteuler.net/)というサイトがあり、これはプログラミングを使って解くパズルがいろいろ集められています。最初のほうはとても簡単なので、このページで解く様を見てプログラミングの感覚を身に付けてみようと思います。

また、アカウントを作るとこんな感じでバッジが作れて、解いた数をみんなに自慢(?)することができます。興味があればやってみてください。


1問目を解いてみる

1問目(https://projecteuler.net/problem=1)は、「1000未満の自然数で、3の倍数であるか5の倍数であるものの総和を求めよ」という問題です。数学的に何も難しくはありませんが、若干面倒です。当然高校数学を少し使えば解けるのですが、頭を使わずとも(それが良いことかはともかく)現代コンピュータの計算力の暴力で解決することができます。やってみましょう。

s = 0
for i in range(1, 1000):
    if i % 3 == 0 or i % 5 == 0:
        s += i
print(s)

このコードは、冒頭で紹介したチュートリアルの4.3までを読めばほぼ理解することができますが、一緒に読んでみましょう。まず、足し算の経過を覚えておきたいのでs=0として、変数を宣言しましょう。ここに、足し算すべきものをどんどん足していって、総和を求めようという算段です。「for i in ...」というところで、iを1から999まで次々変えながら、インデント(空白)で区切られた範囲を実行します。気分としては、数学でいうところの総和のΣで、添字が走りながら中を計算するのと同じ感じです。「if ...」のところで、次々変化するiが3の倍数であるか、5の倍数であるときのみ、インデントで区切られた範囲を実行します。今回は、iが3の倍数か5の倍数であるときのみ、sに値を足すという操作をしたかったのでifを使いました。「s += i」で、今覚えているsの値にiを足すという更新をします。最後に、計算し終わったsを印字させます。これで実行すると、答が出てきますので、それをProject Eulerの提出ページに入力してみてください。答えがあっていればOKと言ってくれます。

もしもプログラムが文法的に何か間違っているようであれば、実行がうまく行かなかった旨が端末に表示されますので、それを参考に直してみてください。もしも出した答が間違っているなら、プログラムを何か間違えたのでしょう。よく読みなおして、そのプログラムで正しいのかを確認してみてください。

2問目を解いてみる

2問目は、「400万未満のフィボナッチ数列のうち、偶数のものすべての総和を求めよ」という問題です。もちろんフィボナッチ数列をよく観察すれば、偶数が現われるのがどこかなどに気づけて効率良く計算できるでしょうが、400万をナイーブに計算しても現代の計算機には屁でもないので素直にやりましょう。

a = 1
b = 2
s = 2

while(b < 4000000):
    temp = a + b
    a = b
    b = temp
    if temp % 2 == 0:
        s += temp

print(s)


フィボナッチ数列を順次計算していって、偶数が出てきたらそれを足していくという戦略で行きましょう。それに当たって、フィボナッチ数列すべてを覚えておく必要はなく、前2項だけを覚えておけば良いのでそれをa、bとしておきます。総和を覚えておくところは2としておきます。bが現在のフィボナッチ数列の先頭なので、それが4000000未満である限り操作をくりかえせという命令が「while…」のところです。そして、フィボナッチ数列の計算を前に進めます。それには、新しいaの値を以前のbの値に、新しいbの値をa+bにすれば良いです。ただ、そのまま「a = b」とaを更新したあと「b = a + b」としてしまうと、こちらのaは新しいaなので間違えてしまいます。そこで、tempにa+bの値を先に計算しておき、その後に「a=b」とすればこの不具合を避けることができます。数学だとあまり意識しないかもしれませんが、変数の状態はプログラム中で次々変わっていくので注意しましょう。

プログラムで計算することと数え上げおねえさんについて

ここまでご覧になると、「なーんだどんな問題もそのまま書いてプログラムに投げればなんでも解けちゃうんじゃん」と思われるかもしれませんが、工夫してプログラムを作らないと計算が終わらないということが多々あります。そのあたりについては「計算量」で調べていただくのが一番正確ですが、手短かつ衝撃的なこの話題についての教材として、日本科学未来館で使用された、 『「フカシギの数え方」おねえさんといっしょ!みんなで数えてみよう!』が大変教育的です。


AtCoderについて

このようなプログラムを使った問題を時間制限つきで解いて皆で競い合う会がいろいろ催されており、日本だと最近はAtCoder(http://atcoder.jp/)が有名になってきました。結構難しい問題も出るAtCoder Regular Contest(ARC)と、プログラムを始めたばっかりの人でも楽しめるAtCoder Beginners Contest(ABC)と、その他臨時コンテストがあります。他にもプログラミングのコンテストには「RedCoder」や「Google CodeJam」など様々あります。特に入試数学が好きだった人ははまるのではないかと思います。肌に合うようなら楽しんでください。

文責

TA 奥殿貴仁

Comments