Pythonの基礎をマスターしよう

「数論とPython」シリーズ 2018/11/13

今回はプログラミング言語であるPythonの基礎的な使い方を学んでいきましょう。 今まで全くプログラミングに触ったことがない人でも大丈夫なように基礎の基礎から始めます。

なぜPythonか

Pythonは近年データサイエンスや深層学習(deep learning)などの科学分野でよく使われるプログラミング言語です。 そのような難しそうな分野で使われているプログラミング言語は難しいのでは? プログラミング初心者がいきなり無理では? と思われるかもしれませんが, 実は逆なんです。 Pythonはとてもシンプルで簡単なプログラミング言語なんです。 だからこそ多くの人に使われているのです。 最近は, 大学でのプログラミングの授業にPythonから始める大学も増えてきました。

整数論の問題をPythonで解いたり, データを集め解析することを通じて整数論とPythonの両方の能力を培うのが私たちのテーマです。

このページに書かれているPythonの基礎的なことを学ぶだけでも, すごく強力な武器となります。 全部を暗記する必要はありません。 必要に応じて, もう一度読み直してください。

Pythonのダウンロードの方法

まず, Pythonを使うにはパソコン(Windows, MacOS, Linux)が必要です。 スマホやタブレットで見てる人はパソコンを用意してください。

Pythonをパソコンにインストールする方法ですが, Anaconda(アナコンダ)というPythonを始めるにあたってあると便利なものをまとめてインストールできる優れものがあるのでそちらをダウンロードしましょう。 無料で, 登録等無しでダウンロードできます。

Anaconda(アナコンダ)をダウンロードに行ってください。 Python 3.*と書いてあるもの(*は何かしらの数字)とPython 2.7と二種類ありますが, Python 3バージョンを使いましょう。 Python 2は古いバージョンで, どうしてもそちらを使いたい理由がある人以外は, Python 3をダウンロードすれば問題ないでしょう。

Jupyter notebookを起動しよう

案内に沿ってアナコンダをインストールしたら, 「Anaconda-Navigator」というアプリがパソコンに入っているので起動してみましょう。 起動したら, Jupyter notebookを起動(Launch)しましょう。 Jupyter notebookはウェブブラウザ(ChromeやSafariなど)上でPythonのコードを書いて実行できるノートです。 ご自分のパソコン上のフォルダが表示されたと思います。 (一緒にターミナルも開きますが, これは触らずにほっておけば大丈夫です。) これから作成するファイルを保存したい場所まで移動しましょう。 必要であれば, 右上の「New」ボタンから新しいフォルダを作ることができます。 さて, ファイルを保存する場所を決めたら「New」のボタンを押して「Python 3」をクリックしてください。 すると新しいタブが開いて

In [ ]:

と表示されていると思います。 それではその横に1+1と入力してください。 入力が終わったらShift + Enter (Shiftキーを押しながらEnterキー)を押してみてください。

すると

Out[1]: 2

と表示されるはずです。 この\(2\)が上の1+1の計算結果です。 Pythonがしっかりインストールされて動いてる証拠ですね。

先ほど, 1+1を入力したボックスのことをセルと呼びます。

Jupyter notebookの保存方法

では, この結果が入っているノートを保存してみましょう。 まず, ノートの一番上の方にある「Untitled1」をクリックして, ノートに好きな名前をつけてください。 そしてノートの名前の下にあるメニューから「File」を選び「Save and Checkpoint」を選択することでノートの保存ができます。 保存先は最初にノートを作成した場所です。

Jupyter notebookの終了方法

保存が終わり, ノートでの作業を終えるときは最初に開いていたHomeタブに戻り, 上のメニューから「Running」に行き, 今まで開いていたそれぞれのノートの「Shutdown」ボタンを押してノートを終了します。 その後はウィンドウを閉じてOKです。

ターミナルの方はControl+cを同時に押すと

Shutdown this notebook server (y/[n])?

と表示されるのでyキーを押します。 その後, ターミナルを閉じて終了です。

電卓としてのPython

さて, Pythonのインストールができ, Jupyter notebookで1+1の計算もできました。 これでプログラミングを始める準備は完璧です。 でもいきなり難しいコードを書くのは大変なので, まずはPythonを電卓のように使ってみましょう。

一番始めの例のように, 足し算は+でできます。 Jupyter notebookを開いて

と入力してShift + Enter を押すと結果の\(5\)が表示されます。

引き算は-, 掛け算は*, そして割り算には/を使います。 例えば,

のように書いて見ましょう。 このときに一つのセルには一つの計算式だけを書いてShift + Enter を押して計算を実行してください。 結果はそれぞれ, 3, 15, 1.6666666666666667になったと思います。

もうひとつ割り算をみてみましょう。

6/3

結果は何でしたか? \(2.0\)が得られたと思います。 少し疑問に思ったかもしれませんが, \(6\)割る\(3\)はきっちり割り切れるので, 結果は\(2\)のはずです。 もちろんそれを\(2.0\)と書いても数学的には同じです。 しかしPython的には\(2.0\)は小数を扱っていることになるのです。 先程の\(5/3=1.6666666666666667\)の結果のように多くの分数は小数で表示されますからね。

実は整数同士の割り算で, 答えに整数を返す割り算があります。 /の代わりに//を使ってみましょう。 次のコードをJupyter notebookにひとつずつ書いて実行してみてください。

結果は上から\(2, 2, 0\)となったと思います。 これらは割り算の小数点以下を切り捨てた結果の整数を返してきます。 つまり, 整数の割り算の商を結果として返してきます。

割り算の余りを返す%

加減乗除に加えて他にも便利な計算をしてくれる機能がPythonにはもともと備わっています。

まずは整数の割り算の余りを返してくれる演算%です。 使用例をみてみましょう。

の実行結果は\(1\)です。 これは\(13=3\cdot 4 +1\)から余り\(1\)だからです。

指数(べき乗)

次は指数です。 例えば\(2^5\) (\(2\)\(5\)乗) を計算したいときは**を使います。 掛け算で使った記号*を2つ並べて使うと指数演算になります。 例えば,

の実行結果は\(32\)です。

カッコを使った計算

Pythonではカッコ ( ) を用いた式も計算して答えを出してくれます。 例えば

は16を返します。 カッコで囲んだ\(3 + 5\)をまず計算し, その結果の\(8\)と残りの\(2\)を書けて\(16\)を得ています。 このようにカッコを使ってどの演算を先に行うかを指定できます。 試しに今の式をカッコなしで実行してみてください。

すると実行結果は\(13\)となりました。 これは学校で習ったように, 足し算より掛け算を先に計算するためです。

コメントの書き方

Pythonのコードを書いてるときにメモを残したくなるときがあります。 そんなときには#を入力するとその後に書かれたものはコメントになり, Pythonの実行結果には影響しません。 例えば

の「これは13を4で割った余り」はコメントとなり実行結果は単に1と表示されます。 コードが長くなると, 後で見返したときに, 書いてあることの意味が自分でもわからなくなるときがあります。 そうならないためにもコメントをうまく利用しましょう。 また他人に見てもらうときにも理解してもらいやすくなるメリットもあります。

ブール型

さて, これまでは数字の計算を見てきましたが, Pythonは数字以外にも他の「型」を扱うことができます。 数学の議論でよく使われる型が今から学ぶブール型です。 ブール型はTrueFalseの2種類の値のみからなります。 Trueは真, Falseは偽の英語です。 ブール型は真偽を扱うときに使います。 例えば, 不等号\(3>2\)は正しい式です。 一方で\(5 < 2\)は間違っています。 これをPythonに判断してもらうには

と入力します。 すると実行結果はTrueが返ってきます。 Pythonが式の真偽を判別してくれました。

ではこれを使って次の問に答えてみてください。

\(2^{16}\)\(3^{11}\)ではどちらが大きいでしょか? もちろん一つずつPythonを使って計算して比べてもいいですが

を実行するとFalseと返ってくるので上の式は偽, つまり\(3^{11}\)の方が大きいのです。 不等号を逆にして

と書けばTrueが返ってきて\(3^{11}\)の方が大きいことがわかります。

不等号たち(\(>, <, \geq, \leq\))

上で扱った不等号に加えて以上 >= , 以下 <= なども使えます。 例えば

はTrueとなります。 このように判断してもらう式に計算を含めることも可能です。

AとBは等しい?

AとBが等しいかどうかをPythonに判断してもらうには==を使います。 例えば

はTrueとなります。 実際, 両辺とも24になりますね。

注意点は, イコール記号=を2つ使うということです。 後で出てきますが, Pythonでは\(A=B\)は変数\(A\)に値\(B\)を代入するという違う意味になります。

AとBは等しくない?

次に, AとBが等しくないかどうかをPythonに判断してもらいたいときもあります。 これには!=を使用して

などと書きます。 さて, この実行結果はなんでしょうか? 左辺は10を3で割った余りですから1ですね。 右辺は2。 1と2は異なりますから両辺は同じではない。 つまり答えはTrueです。 もし!=の代わりに==を使っていたら答えはFalseです。

変数

Pythonにおける変数とは数値やブール値などのデータを保存しておく箱のようなものと考えてください。

例えば

と書きます。 これはaという箱の中に100を入れておくという意味になります。 変数aに100を代入すると言います。 そして次の例のように, 変数aをあたかも100のように扱うことができるのです。

この実行結果は40となります。 (上のa=100を別のセルに書いた場合はそちらのセルを先に実行するのをお忘れなく。)

変数の名前

上の例では変数にaという名前をつけましたが, 変数は一文字である必要はありません。

  • 小文字の英字
  • 大文字の英字
  • 数字
  • アンダースコア

が使えます。 ただし, 変数の名前の先頭には数字は使えません。

数学では一文字で変数を表すことが多いですが, プログラミングでは, その変数がどのようなものかわかりやすい名前を付けることが多いです。 例えば

はbig_numberという箱(変数)に \(2^{100}\)を入れたということになります。

名前の命名ルール

変数は基本的には上のルールさえ守れば基本的にはどんな名前でもつけられますが, Pythonでもともと使われている名前はつけられません。 例えば, Trueという変数の名前はつけられません。 なぜならTrueはブール値に使われており, すでに特定の意味を持つからです。

変数の再代入

さて, 変数は箱のようなものと説明しました。 箱の中身は入れ替えることができるように変数の値も変えることができます。

では次のコードを実行した結果の数字はなんでしょうか? 予想してみてください。

最初の式で変数favorite_primeに5を代入していて, 二行目で同じ変数に11を代入してます。 最後にfavorite_primeに2を足しています。 結果は7でしょうか? それとも13? それとも両方でしょうか?

結果は13となります。 変数は箱で, =は代入です。 新しい数が代入されたら, もともと箱に入っていたものは消えてなくなってしまうのです。 なので11が代入されたとき, もともと入っていた5は消えてしまっているのです。

Pythonの=は数学の=とは違う

数学における=記号の使い方は, 今見たPythonでの=の使い方とは違います。 数学では\(A=B\)\(A\)\(B\)が等しいことを意味します。 なのでこの場合\(B=A\)も正しいのです。 しかし, Pythonでは\(A=B\)\(A\)\(B\)を代入することでした。 この違いを, 例を使って説明します。

はfavorite_primeという変数に5の値を代入するという意味でした。 favorite_primeの箱に5を保存しておくイメージです。 これが

としていますと5という箱ににfavorite_primeを保存しておくという意味になってしまいます。 この場合, そもそも\(5\)を変数として使うことはできないので, 意味を成さない式となりPythonはエラーを出します。

Pythonにおける=は常に右のものを左に代入すると覚えておきましょう。

変数の値を更新する

上でみた

のコードのように, 同じ変数に別の値を代入すると新しい値に書き換えられるのでした。 この代入の便利なところは変数自身の値を使って変数の値を更新できることです。 これだと意味がわかりにくいと思うので例をみてみましょう。

まず, 一行目は変数\(n\)に1を代入しています。 二行目に注目してください。 ここにも代入記号=があるので, 右の値\(n+1\)を左の変数\(n\)に代入するということでした。 右の\(n+1\)の値は, 今現在の\(n\)の値が\(1\)なので, \(n+1\)の値は\(2\)となっています。 この値を変数\(n\)の箱に入れ直すのです。 つまり, 二行目の時点で変数\(n\)の値は\(2\)に置き換わったことになります。 最後に, 三行目はその\(n\)の値に\(1\)を足す, つまり答えは\(3\)となるということです。

プログラミングになれていないころは\(n=n+1\)をみると\(n\)をキャンセルして\(0=1\)となり, なんだか矛盾しているように見える式ですが, Pythonでは=は代入なので正しい式なんですね。

では次のコードの結果を考えてみてください。 自分で答えを出してからPythonで実行して結果を確かめてください。

これは順次前の結果に\(2\)を書けていく操作です。 答えは\(32\)になります。

変数は何個使っても大丈夫です。 例えば

を考えてみましょう。 最初の二行で\(s\)には1を, \(t\)には2を代入してます。 三行目で\(s\)の値を\(1+2=3\)に変更してます。 四行目は\(t\)の値を更新するのですが, すでに\(s\)の値は\(3\)に変更していることに注意すると, \(t\)\(3-2\)\(1\)になります。 五行目で\(s\)の値を\(3+1=4\)に更新し, 六行目で\(t\)\(4-1=3\)に更新しています。 最後の七行目で, \(s\)\(t\)を足して得た\(7\)が答えとなります。 実際にJupyter notebookで確かめてみてください。

print関数を使って画面に表示させる

さて, これまでJupyter notebookでコードを書いて実行すると, 下のセルに結果が表示されました。 これはJupyter notebookが自動的に最後に得られたデータを表示しているのです。 例えばもし

と書いて実行してもJupyter notebookは何も結果を表示してくれません。 これはappleという変数に3を代入するという操作でした。 Pythonは代入したけど, それを使って何かするという命令を与えられていないので, 何も結果を返さないのです。 そこでPythonにappleに入ってる数字を表示してほしいと頼むコードがprint関数になります。

を実行すると変数appleの中身の\(3\)を表示してくれます。

listの使い方

次に, Pythonにおけるリストの使い方を学びましょう。 リストとはデータを並べたもので, 例えば

は2, 3, 5, 7の要素からなるリストとなります。 変数の値としてリストを使うこともできます。 例えば,

prime_list = [2, 3, 5, 7]

とすると変数prime_listにはリスト[2, 3, 5, 7]が入っていることになります。

リストの要素の順番には意味がありますので, 先程のリストと要素の順番を変えた[3, 2, 7, 5]は別のリストとなります。 実際にJupyter notebookで

==を使ってリストを比較するとFalseと返ってきます。

リストの要素には左から順に番号がついています。 注意するべき点は, 一番左の要素の番号は0(ゼロ)で, その右隣が1となっています。 つまり数え始める番号が0からなのです。 日常では1, 2 ,3と数えることが多いですが, プログラミングでは0, 1, 2と0から数え始めることが多いのです。 この要素の番号のことをインデックスと呼びます。

[要素0, 要素1, 要素2, 要素3]

という風になっています。

リストから要素を取り出す

リストの後に[i]のように書くと, リストのi番目の要素を取り出せます。 試しにリスト[2, 3, 5, 7]の中から数字の5を取り出したいとします。 5はリストの左から3番目なのでインデックスは2です (0から数え始めるを思い出しましょう)。 そこで

と書けば5が表示されます。 変数を使っても同じようにできます。

と実行するとリストのインデックス1の数字28が表示されます。 もしリストから6を取り出したいときは

とインデックス0を指定してあげましょう。

リストの長さはlen()でわかる

リストの長さ(リスト内の要素の個数)を取得するには

とlen(リスト)と書けばリストの長さ(要素の数)を返してくれます。 この例の場合は7が返ってきます。

forループで繰り返しを楽にしよう

プログラミンでは, 同じような操作を繰り返し行いたいことがあります。 しかし, プログラミングでは同様のことはできるだけ繰り返さないように心がけると, コードが短くそして読みやすくなります。 例えば, 次の例を考えてみましょう。

\(3\)のべき乗\(3^2, 3^3, 3^4, 3^5\)を計算しなさい, という数学の宿題が出ました。 でも私はPythonを使えるのでちゃちゃっと

と書いて答え9, 27, 81, 243を得ます。 これくらいなら電卓を使っても時間はかかりませんね。 今は4つのべき乗を計算しなければなりませんでしたが, もしこれが10個, 20個と増えていったらどうでしょう。 10個も同じようなコードを書くのは嫌になってきますし, どこかで打ち間違える可能性も増えてしまいます。

こんなときに役立つのがPythonの機能としてforループやwhileループと呼ばれるものがあります。 ここでは, forループを説明したいと思います。 (whileループは後で説明します。) まず, 注目するのが上のコードで指数の肩の数字(\(3^n\)\(n\))以外は全く同じコードだということです。 そこでまず指数の肩の数字を[2, 3, 4, 5]とリストにまとめます。 そしてこのリストの要素\(i\)ひとつひとつに対してprint(3 ** i)を実行できればいいことになります。 それをforループを使うと

と書けます。 このコードではまず\(i\)がリストのインデックス0の要素\(2\)になってコロン:の後に書かれた処理を実行します。 その処理が終わったら, 次は\(i\)はリストのインデックス1の要素である\(3\)になり, コロンの後の処理を実行します。 この作業をリストの最後の要素まで繰り返したら終わりになります。

ここで\(i\)の部分は自分で好きな名前を変数と同じようにつけられます。 例えば,

としても結果は同じです。

forループを書くときはforの文の後にコロン:を書き, 処理の部分はインデント(行頭の空白, スペース4つ分)を入れることが必須です。

では, 先程の数学の宿題の指数計算を10個計算してみましょう。 ($3^2$から$3^{11}まで)

## 9
## 27
## 81
## 243
## 729
## 2187
## 6561
## 19683
## 59049
## 177147

と書くとまたたく間に計算結果が表示されます。

では20個ではどうでしょうか? リストを2から11の代わりに2から21のリストを書けば同じようにできるはずです。 でも, そんなに多くの数を書くのは面倒ではないですか? そこで, 次に紹介するRange関数を使いましょう。

range関数

range関数を使えば, 簡単にforループの範囲を指定することが可能です。 書き方は, range(始まりの数, 終わりの数)と書きます。 上の例をrange関数を使って書くと

## 9
## 27
## 81
## 243
## 729
## 2187
## 6561
## 19683
## 59049
## 177147

となります。 同じ結果が表示されたと思います。

注意点ですが「終わりの数」は含まれていないことに注目してください。 range(a, b)と書いたら, \(a\)から順に\(a+1, a+2\)と増えていき最後は\(b-1\)で終わります。 なのでrange(2, 12)は2から11までの数字ということになります。

もしゼロから始める場合にはゼロは省略可能です。 range(5)は0から4までの整数ということになります。

このrangeを用いて, 先ほどの数学の宿題を20個まで答えを出してみましょう

## 9
## 27
## 81
## 243
## 729
## 2187
## 6561
## 19683
## 59049
## 177147
## 531441
## 1594323
## 4782969
## 14348907
## 43046721
## 129140163
## 387420489
## 1162261467
## 3486784401
## 10460353203

これならもし宿題で30個の指数を要求されても22を32に変更するだけですぐ答えがでます。

答えを見やすくする

range関数を使って20個の3のべき乗を計算して, 結果を表示させることに成功しました。 ただ, 答えの表示が数字のみで, どれがどの指数を計算したものかは, 行数を数えて確かめるしかありません。 次にこの問題を改善してみましょう。

文字列を扱う

これまでにPythonで数値, ブール値, リストなどが扱えることを見てきましたが, Pythonは文字列も扱うことができます。 文字列を定義するには‘私は文字列です’のようにシングルクォートで囲むかもしくは“私は文字列です”みたいにダブルクォート"で囲めばできます。 シングルとダブルを片方ずつ使うことはできません。

英語の文章「I’m good!」などをPythonで文字列として扱うときには注意が必要です。 なぜならこの文の中にシングルクォートが使われているからです。 この場合はダブルクォートを用いて

としなければいけません。

文字列もprint関数を使って表示させることが可能です。

の実行結果は

## How are you?

となります。

printを使って文字列と変数を一緒に表示させる

print関数は, カンマで区切って複数の変数や文字列を出力することが可能です。 例えば

## 2×3の結果は 6

このように文字列と変数を並べることはできますが, できれば変数を文字列の中で使用したいというときがあります。 しかし, 次のように書いてはうまくいきません。

## 2×3の結果はn

この実行結果は「2×3の結果はn」となってしまいました。 ダブルクォートで囲んだnは変数のnではなく文字のnだとPythonは判断してしまうのです。

これを回避するためにPythonには様々な機能がありますが, ここではf文字列を紹介しましょう。

f文字列は, 文字列の中でも変数を使えることができるようにする方法です。 文字列の前にfをつけ, 変数はカッコ{ }で囲むことで, 変数は変数として表示されるようになります。 例を見てみましょう。

## 2×3の結果は6です。

それでは, f文字列を使って3のべき乗のコードの出力を見やすくしてみましょう。

## 3の2乗は9
## 3の3乗は27
## 3の4乗は81
## 3の5乗は243
## 3の6乗は729
## 3の7乗は2187
## 3の8乗は6561
## 3の9乗は19683
## 3の10乗は59049
## 3の11乗は177147
## 3の12乗は531441
## 3の13乗は1594323
## 3の14乗は4782969
## 3の15乗は14348907
## 3の16乗は43046721
## 3の17乗は129140163
## 3の18乗は387420489
## 3の19乗は1162261467
## 3の20乗は3486784401
## 3の21乗は10460353203

これを実行すると, それぞれの数に説明がついているので先程より読みやすくていいですね。

では, 今度はこんなシチュエーションを考えてみましょう。 先程の数学の宿題, 隣のクラスでは\(3\)の代わりに\(5\)が使われていました。 また他の学校にいる友だちのクラスでは\(3\)\(5\)乗から\(15\)乗まで計算しなさいという宿題でした。 自分のPythonのコードはもう完成しているので, あなたは友達の宿題を手伝ってあげたいと思っています。 隣のクラスの友達のためには自分のコードの\(3\)\(5\)に置き換えればいいだけだし, 他の学校の友達にはrange(2, 22)range(5, 16)に変更するだけでOKです。 あなたはすぐにこれらの答えを友達に教えてあげました。 すると次の日には噂が広まり, 様々な学校に通う友達から同様の問題を助けてほしいとメッセージが届きました。 困ったことに, みんなそれぞれ少しずつ問題が違うのです。 \(6\)のべき乗や\(7\)のべき乗を使った問題, \(8\)\(10\)乗から\(18\)乗を求めよなど。 一人ひとりに対応することにはほんの少しの時間しかかかりませんが, 何しろ100人近くの友達に対応しなくてはいけないとそれはもう大変です。

…と, こんなシチュエーションを考えます。 こんな場面を解決してくれるのが「関数」です。 次は関数を学んでみましょう。

自分のオリジナルの関数を作ってみる

関数とはなんでしょうか? 関数とはインプットをもらったら, 特定の操作をして, そのアウトプットを返す仕組みのことです。 例えば, 「インプットした数に10を足す関数」にインプットとして\(3\)を入れると, その関数はアウトプットとして\(13\)を返します。 またインプットが\(5\)ならアウトプットは\(15\)です。 このような関数をPythonで定義する(英語でdefine)には下のように書きます。

まずはじめに, キーワードdefを書きます。 その右にスペースを一つ開けて関数の名前を書きます。 この例ではplus_tenとしました。 次のカッコ内にインプットを表す変数を書きます。 ここではxをインプットの名前にしています。 その横にコロン:を書きます。 次の行からその関数がどのような処理をするかを書いていきます。 このときにインデントをするのを忘れないようにしましょう。 この例では, 二行目にresultという変数を用意して, それに\(x+10\)の値を代入し, 三行目でresultの値をreturnしています。 returnされたものが関数のアウトプットになります。

上のコードを実行しても何も出力されません。 このコードはplus_tenという関数を定義しているのであって, 関数を使っているわけではないからです。 このコードを実行するとPythonにplus_tenという関数を覚えさせることができるわけです。 なので次に

と実行すると110が出力されます。 インプット\(100\)でアウトプットが\(110\)となったわけです。

インプットの変数の個数はいくつでも構いません。 例えば, 次のようなインプットが3つの関数も作れます。

この関数square_sumはインプット\(x, y, z\)の二乗を計算し足し合わせたものを出力する関数です。 試しにインプットを入れてみると

square_sum(2, 3, 4)

結果は\(2^2+3^2+4^2=29\)となります。

それでは関数の作り方を学んだところで, 友達の宿題を手伝うための関数を作ってみましょう。

これまでに作ったのは

というコードでした。 友達のためには, このコードの\(3\)やrangeの範囲を色々と変更しなければなりませんでした。 そこで, これら変更が必要な数を変数に置き換えて関数を作ってみましょう。

となります。 インデントが定義defのために一回と, forループのためにもう一回あることに注意をしてください。 この関数power_list(n, a, b)\(n\)のべき乗を\(n^a\)から\(n^b\)まで出力するように書かれています。 この関数を使って先の自分用の結果を再現するには

を実行すればOKです。 結果は次のようになります。

## 3の2乗は9
## 3の3乗は27
## 3の4乗は81
## 3の5乗は243
## 3の6乗は729
## 3の7乗は2187
## 3の8乗は6561
## 3の9乗は19683
## 3の10乗は59049
## 3の11乗は177147
## 3の12乗は531441
## 3の13乗は1594323
## 3の14乗は4782969
## 3の15乗は14348907
## 3の16乗は43046721
## 3の17乗は129140163
## 3の18乗は387420489
## 3の19乗は1162261467
## 3の20乗は3486784401
## 3の21乗は10460353203

もし\(5^7\)から\(5^{13}\)乗までの計算結果がほしい友達がいれば

を実行すれば一瞬でその友達用の答えができあがります。

## 5の7乗は78125
## 5の8乗は390625
## 5の9乗は1953125
## 5の10乗は9765625
## 5の11乗は48828125
## 5の12乗は244140625
## 5の13乗は1220703125

友達がPythonを使える環境にあれば, 上の定義のコードを教えてあげれば友達は自分で3つのインプットを入れるだけでほしい答えが得られます。 このように, 関数はそれぞれのニーズに対応した柔軟な処理ができるようになることがメリットです。

if文で条件をつける

関数がとても便利なことをみました。 色々なことを関数で表せるようになるとPythonの応用力も上がります。 次のような関数を作るにはどうしたらいいでしょうか?

インプット\(n\)が10より大きい場合には,アウトプットに文字列“\(n\)は大きい数です”と出力し, \(n\)が10以下の場合には“\(n\)は小さい数です”と出力する関数。

このような関数を作るためには, インプットに応じて場合分けが必要になってきます。 これこれの条件のときは出力はこう, 別のときはこう, のように条件を扱う必要があります。 Pythonでは, 条件を扱うときにはif文を使います。 まずは例を見てみましょう。

この例ではis_bigという関数を定義しています。 二行目のifが条件文を始めるキーワードです。 ifの右横に条件を書きます。 この例では\(x > 10\)となっているかどうかが条件です。 条件を書いたらコロン:を打って改行します。 次の行はインデントし, もし先程の条件(\(x > 10\))が満たされている場合に行う処理を書きます。 ここでは「\(x\)(の値)は大きい数です」と出力されるように処理を書きました。 (f文字列を復習しましょう。)

次の行のelseにはもし条件を満たさなかったら行う処理を書きます。

上の関数を試してみると

## 9は小さい数です
## 10は小さい数です
## 11は大きい数です

インプットが10より大きいか否かで場合分けされてることがわかります。

if, elif, else。 複数の条件を持つ場合

もしも最初の条件を満たさなかったら, 次に別の条件を満たすか確かめたいときもあります。 このようなときにはelifが使えます。

構文を先に確認してみましょう。

ここでelifは複数個あっても大丈夫です。 では, 例を見てみましょう。 次の関数はインプットの数を\(4\)で割った余りで場合分けしています。

実際に何個か試してみましょう。

## 8は4で割り切れる数です。
## 9を4で割った余りは1です。
## 10を4で割った余りは2です。
## 11を4で割った余りは3です。

練習問題

自然数\(n\)をインプットしたときに, \(n\)が偶数ならTrueを奇数ならFalseを返すような関数を作ってください。 ここでTrueとFalseは文字列ではなくブール型です。 その関数に\(10, 5, -128\)を入れてTrue, False, Trueと出力されることを確かめてください。

解答

自然数$n$が偶数か奇数かは$2$で割ったときの余りが$0$かどうかで判断できます。 余りを求める%を使うと, $n % 2$が$0$なら$n$が偶数だとわかります。 この考察をコードにすると以下のようになります。

この関数に\(10, 5, -128\)をそれぞれ入れてprint関数で表示させてみると

## True False True

while文で繰り返し処理

上で, forループを使って繰り返しを扱う方法をみました。 今度は, while文を説明したいと思います。 これもforループのように繰り返しの処理をするのに向いています。 基本的な書き方は次の通り。

これを使って引数が\(n\)のとき\(n\)から\(1\)までの整数を出力する関数を作ってみます。

この例では, 条件文はn > 0です。 この条件が成り立つ限り, 次の2つの操作print(n)n = n - 1を繰り返します。 ポイントはn = n - 1の部分です。 このコードを一回実行するごとに\(n\)の値が\(1\)ずつ小さくなっていくのです。 それによってwhile文の条件n > 0がいつかは満たされなくなり終了するというわけです。

forループと使い勝手が似ていて, 実際while文でもfor文でもどちらでも書けることも多々あります。 while文は条件文がいつ終わるかわからないときに力を発揮します。

例えば, 次の関数は与えられた自然数が\(2\)で何回割り切れるかに答えてくれます。

ではこの関数の動きを見ていきましょうresult\(n\)が何回\(2\)で割り切れるかを記憶しておくための変数です。 最初の値は0にしておきます。 While文の条件はn % 2 == 0\(n\)\(2\)で割り切れる限り次の処理をします。 \(n\)\(2\)で割り切れるので\(n\)\(n/2\)で置き換えますn // 2は整数での割り算でしたね。 そして一回\(2\)で割り切れたのでresultの値を以前の値から1増やします。 それがresult = result + 1です。 これで処理の部分は終わりで新しい\(n\)の値でwhile文の条件を確かめるところに戻ります。 そして最後にwhile文が終わったらresultの値を返します。 これが\(n\)\(2\)で割り切れた回数になります。

もし\(n=12\)の場合, \(n\)の値は\(12 \to 6 \to 3\)と変遷し\(3\)になった時点で\(2\)で割り切れなくなりwhile文から抜け出すというわけです。

Pythonでインクリメントする方法

上のコードでresult = result + 1と書きました。 これは古い変数resultに1を足した値をresultの新しい値とするとう意味でした。 このように変数自身の値を使って変数の値を更新する場合には次のような累算代入が行えます。

これはresult = result + 1とまったく同じ意味です。

強制的に終了させる方法

文法的に間違ったコードを書いたり, 大量の計算が必要であったりして計算がなかなか終わらないことがあります。 Jupyter notebookで計算中のセルにはIn [*]と表示されます。 すぐに計算が終わりそうなプログラムであるのに, なかなか終わらない場合は, どこかでミスをしていて永遠に終わらないループになっている可能性もあります。 そんなときはJupyter notebookのメニューの中のKernelからInterruptを押すと強制的に計算を終わらせることができます。

Pythonの基礎マスター

以上で, Pythonの基本的な使い方はマスターしました。 ここで学んだことだけでも, 様々な応用にPythonを使うことができます。

次回は, Pythonの「モジュール」について学びましょう。 これは言わば, 人類の知恵を使わせてもらえるとても貴重な機能です。

前のトピック

素数が無限個あることについての考察

素数が無限個あることについての考察

素数が無限個あることを証明します。 証明の前に素数の個数に関するデータを見て, $n$以下の素数の個数がどのように増えていくかをグラフ化します。 また, 特殊な形をした素数の個数の無限性についても議論します。 続きを読む

次のトピック

pythonモジュール

Pythonのモジュールを使おう

前回, Pythonの基礎的な使い方を学びました。 defを用いてオリジナルの関数を作る方法もみました。 自分が好きなように関数を作れる, それがプログラミンの面白いところです。 でも, すべてを自分ひとりで作るのはとても骨の折れる作業です。 前回扱った「数学の宿題」の例のように, もし誰かがすでに便利な関数を作っていたのであれば, それを使わせてもらえたら効率がいいですよね。 そこで登場するのがモジュールです。

続きを読む