見出し画像

ゆるいPython

イントロダクション

Pythonをきっかけにして,いろいろな人と関わる機会があります。私が,日本で最初の,そして最も長く読まれているPythonの入門書を書いているからだと思います。
プロのエンジニアはもちろん,AIや遺伝子を研究している方,データ解析,CGデザイナーのようなアーチスト,業務の自動化をしたい人など。最近では,学校でPythonを学んでいる学生や,プログラミング教育に関わる人などと仕事をさせていただくこともあるんです。
Pythonは本当にいろいろな人達に使われています。プログラミング言語は他にもたくさんありますが,Pythonほど,いろいろな種類の人に使われているものはありません。
Pythonを使っている人はみな,それぞれに解決したい「課題」を持っています。仕事でプログラムを作りたい。AIの研究をしたり,遺伝子の解析をしたい。IoTシステムを作りたい。エクセルの自動化をしたい。また,CGを作りたい,学校の宿題を解きたいなど,いろいろな種類の課題を持っています。
たくさんの種類の,人それぞれの課題を「解く」ために,みんなPythonを道具として使っているのです。太い幹を持った木があります。そこに,いろんな種類の実がなっています。その実を,いろんな人達が食べている。現在のPythonを絵にするとしたら,こんな感じになるのだと思います。

Pythonの木

いろいろな分野の人達のための,「役に立つプログラミング言語」。それが今のPythonです。
Pythonという木から伸びている枝には,とても大きな広がりがあります。この広がりは,みなさんが感じている「プログラミング」という言葉への興味ともリンクしているはずです。
2023年の時点で世界の億万長者トップ10のうち,8人はプログラミングができる人なのだそうです。リストの二番目にいるイーロンマスクも,Pythonを勉強しました。「プログラミングの実」はとても美味しいのです。

Pythonのプログラム

Pythonに課題を解決してもらうには,「プログラム」を作る必要があります。Pythonを道具として役立てるために,Pythonのプログラムを作るのです。
プログラムは「言葉」の一種です。「Python」という種類の言葉があるのです。Pythonという言葉を使うと,コンピュータにいろいろな「仕事」をお願いすることができます。
他の人に仕事をお願いするときのことを考えましょう。「荷物を運んで下さい」というように,言葉を使ってお願いしたいことを伝えますね。「何を」「どうする」という,2つの要素を使って仕事の内容を伝えるのです。Pythonでも基本は同じです。コンピュータにしてほしい仕事の内容を,ちょっだけ特別な言葉を使って伝えます。
「だけど,Pythonってコンピュータのための言葉なんでしょう。きっと難しいに決まっている」。みなさんの多くは,そう考えていると思います。
ぜんぜんそんなことはないのです。Pythonを使えるようになるために,覚えるべき約束事はあまり多くありません。それに,ちゃんと書きさえすれば,伝えたいことが100%確実に伝わります。こんなに簡単で便利な言葉は他にはありません。Pythonより,単語もルールも沢山ある日本語や英語の方が100億倍難しいと私は思います。
最も簡単なPythonのプログラムは計算式です。次の計算式をPythonが読むと,計算をして答えを教えてくれます。

5+2

皆さんが学校で学んだのとほとんど同じような「計算式」ですね。この式に書いてあるのは,「5と2という数を(何を)」「足し算する(どうする)」ということです。お願いしたい仕事についての2つの要素が,ちゃんと書いてあるのが分かります。人間が読んでもPythonが読んでも,同じように理解でき,答えを出せるプログラムです。
Pythonでプログラムを実行してみたい人は,こちらのリンクをクリックしてください。Googleの運営しているColaboratory(コラボラトリー)というサービスを使って,WebブラウザでPythonを実行できます。プログラムの左にある三角形のボタンを押すと,プログラムを実行できます。Googleのアカウントでログインが必要です。最初だけ警告が表示されますが,右下の「そのまま実行」ボタンを押してください。答えはプログラムの下に表示されます。
ここまで読んだ皆さんは,「人間が暗算できてしまうような計算をPythonが解いてくれても」と感じていることだと思います。確かにそうですね。
もっと難しい式をプログラムに書いて計算をお願いすることもできます。でも,みなさんが知っているコンピュータは,どう考えても計算よりもっと高度なことを実行しているように見えます。

変数と計算

「ただの足し算」は,どうみても残念なプログラムに見えます。5と2を足してみて分かることはほとんどありません。数は抽象的な概念に過ぎないからです。
数に意味を与えると,少しだけ計算が役立つようになります。

りんご = 5
みかん = 2

私たちが学校で学んだのとは異なる,Pythonの特別な書き方が出てきました。このプログラムを人間が理解するには説明が必要です。
このプログラムに書かれた「りんご」「みかん」のような部分のことを「変数」と言います。
「変数は箱のようなもので」と,よくプログラミングの入門書に書いてあります。Pythonがこのプログラムを読むと,「りんご」と「みかん」という二つの箱を用意します。そしてそれぞれの箱に「5」と「2」という数を入れます。
人間側から見ると,数にそれぞれ「りんご」と「みかん」という「名前をつけている」,という方が伝わりやすいと思います。勘のいい人なら,プログラムを見ただけで「りんごが5個」と理解できるかも知れません。抽象的な数に,具体的な名前が付け加わったことによって,人間がより理解しやすい「意味」がプログラムに生まれます。
次のプログラムを見て下さい。

りんご+みかん

人間がこのような「式」を見たら,多分いろいろな事を思い描くと思います。りんごとみかんを混ぜたジュースを作るのか,あるいは遺伝子を解析・合成して新種のくだものを作るのか,人によって考えることは変わるでしょう。
Pythonの場合は,変数の中に入った数を使って計算をします。それぞれの変数に入っている「5」と「2」という数を使った計算を実行するので,次のプログラムの実行結果は「7」になります。
Pythonのプログラムでコンピュータに仕事をお願いするとき,「何を」の部分には変数と数を使います。そして,変数を使って計算式を作ることで,「どうする」を指示します。これが,Pythonのプログラムを作るときの基本です。
りんごとみかんを合わせた数の計算をプログラムにしても,まだ面白くありません。計算に命をかけてみましょう。ちょっとした「物語」を導入します。

あなたを含め13人のクルーが乗った宇宙船のタンクが破損して,燃料がなくなってしまいました。宇宙船に残った酸素タンクは7本,クルー1人が1日過ごすのにタンク0.13本分の酸素が必要です。救助船が到着するまでは5日かかります。

救助船到着まで,酸素タンクが持つのかどうか知りたいですね。計算をしてみましょう。まず,変数を使って計算に必要な数に名前をつけます。

日数 = 5
クルー人数 = 13
酸素消費量 = 0.13

クルーが5日間過ごすのに必要な酸素消費量を計算してみます。クルーの数に一人当たりの酸素消費量をかけて,さらに日数をかけます。Pythonでかけ算をするには,「*(アスタリスク)」という文字を使います。Pythonの計算では「×」という文字の代わりに似た記号を使って計算を行います。

クルー人数*酸素消費量*日数

Pythonの計算結果は「8.45」です。このままでは救助船の到着前に酸素が尽きて,クルー全員が窒息死してしまいます。
0.13という数は酸素消費量を限界まで節約した値です。救助船も全速力で航行しているため,これ以上到着を早めることはできません。このプログラムで調整可能な数は「クルー人数」だけです。実際にプログラムを書き換えて実行すると分かるのですが,クルー人数を3減らして10にすると,必要酸素量がタンク6.5個分になります。
ところで,この計算を行った後,宇宙船のクルーは,船内の資材を加工する方法を発見し,わずかな代替燃料を合成することに成功しました。タンクを修理し,救助船が4日で到着できる位置まで移動できたため,全員が無事救出されたのでした。

モデル

「モデル」とは,身の回りにあるいろいろな「ものごと」を見るときの,「ものの見方」というような意味の言葉です。そして,ある「見方」でものごとを見ることを「モデル化」といいます。ものごとを数に置き換える時には「数値モデル」を使います。なんでも数に置き換えて考えることは「数値モデル化」と呼ぶことができます。
宇宙船の物語では,クルーの直面している課題を「数値モデル化」して調べました。そして課題を解決できないことが分かりました。あらかじめ問題が起こることが分かったからこそ,別の方法を使って解決するように舵を切れたと言えるかも知れません。
数値モデル化は,Pythonのプログラムを作るときに基本となる考え方です。数を入れた変数を使って課題を表現し,計算を行うことで答えを知るためにプログラムを作るのです。
もう少し身近な課題を,数値モデルを使って解決してみましょう。

あるお店では,商品の価格に10%上乗せした金額を払うとくじを引くことができます。くじには20回に1回の割合で商品が無料になる「当たり」が含まれています。この商品を,くじ付きで買うべきでしょうか?

いろいろな解き方ができそうです。なんとなく課題を見ている人は「タダになる可能性があるのなら,10%余計に払おう」と考えるかも知れません。数値モデルを使うと,ずっとスマートに結論を出すことができます。
数値モデルの一種,「確率モデル」を使って,この課題をプログラムで解いてみましょう。まず,10%上乗せして商品の価格がいくらになるのかを計算するために,変数に数を入れるプログラムを作ります。変数に数を入れることを「代入(だいにゅう)」と言います。

商品の価格 = 1000
上乗せ率 = 1.1   # 100%(商品の値段)+10%

「#」とそれ以降の部分はPythonでは「コメント」と呼ばれています。コメントを読むと,「上乗せ率」という変数に入った数は,商品の値段に10%上乗せしたパーセンテージ110%を小数に直したものだと分かります。コメントは注意書きのようなものです。プログラムを読み解く助けになる情報が書いてあるのです。
商品の価格に,上乗せ率を乗じた価格を計算してみましょう。

商品の価格*上乗せ率

プログラムを実行すると,「1100.0」という数が表示されます。1000円の商品をくじ付きで買う場合に支払う値段が分かりました。
「くじを引いて20回に1回無料になる」という部分は,どのように数値化すればいいでしょうか。ある人は,たまたま「当たり」,別の人は「はずれ」ます。くじの結果はランダムなので,だれが当たるかを数値化するのは難しそうです。
そこで問題の見方を変えて,「とても多くの人がくじを引く場合」を考えます。それぞれの結果はランダムだけど,結果を平らに均すと,20回のうち1回は当たりが出ます。外れるのは,20回に19回です。

買う回数 = 20
当たる回数 = 1
外れる回数 = 19

お金を払うのは,外れた時です。20回の買い物のうち,19回でいくら払うかを計算してみましょう。「/」はPythonで割り算をする時に使う記号です。

商品の価格*上乗せ率*(外れる回数/買う回数)

「1045.0」という答えが返ってきます。計算式で丸括弧の中にある「外れる回数/買う回数」の部分は「確率」と呼ばれる数です。価格に確率を乗じると,何回もこのお店でくじ付きの商品を買った時の,1回あたりに払う金額の平均が分かるのです。このような数は「期待値」と呼ばれいてます。期待値を見て分かることは,お得に見えるくじも実は割高だった,ということです。
このようなくじを使った商売は,売る方にとってはとても魅力的です。なぜなら,客にお得感を感じさせ,かつ1000円の商品を1045円で買ってもらえるからです。客の立場からすると,一見お得に見えて損をします。ですから,このような商売は,法律によって禁止されていることが多いのです。

関数

私たちは,日常的にいろいろな数に囲まれて暮らしています。やっかいな病気を引き起こすウイルスの感染者数や,降水確率,平均株価。このような数の多くは,数値モデルを使って世の中の出来事をとらえ,計算式を使って答えを出すことで得られる数です。このような数を「指標」と呼ぶことがあります。
肥満度を計算するためのBMIも指標の仲間です。BMIを知ることで,生活習慣病などを予防し,健康の維持に役立てることができます。
BMIは身長と体重から計算することができます。身長173cm,体重68Kgの成人男性のBMIを計算するPythonのプログラムを書いてみましょう。プログラムを見ると,体重を身長の二乗で割るとBMIが計算できることが分かります。

身長 = 1.73  # 単位はm
体重 = 68    # 単位はKg
BMI = 体重/(身長*身長)  # 公式でBMIを計算する

プログラムの最後の行は,これまでと違った書き方になっています。イコールの左にBMIという変数があり,右側には式があります。このような書き方をすると,Pythonは式の計算結果を変数に代入する(入れる),という動きをします。BMIという変数に,計算結果が入るのです。
計算の結果を見たいときには,変数名だけを書いたプログラムを実行します。

BMI  # 変数の中身を確認する

「22.72…」という数が表示されます。日本肥満学会の判定基準にある,成人の普通体重の範囲18.5から25までに収まっているようです。
他の人のBMIを計算するときはどうすればいいでしょうか。「身長」と「体重」という変数に入れる数を書き換えて,同じようにプログラムを実行すればよいはずです。
Pythonで同じ計算を何度も手軽に実行したいとき,「関数」という仕組みを使うと便利です。関数は「作る」ことで使えるようになります。
PythonでBMIを計算する関数を作ってみましょう。関数を作ることを「定義する」と言います。

def BMIを計算する(身長, 体重):
    BMI = 体重/(身長*身長)
    return BMI

「def」や「return」のような新しく出現した英単語があり,またプログラムの一部が右に寄っています。今の時点では,次の点にだけ注目して下さい。
defの後に「BMIを計算する」と書かれた部分があります。これは関数につけた名前で,「関数名」と呼ばれています。
そして,変数に代入する部分がなくなっています。その代わり,1行目の丸括弧の中に,先ほどと同じ名前が2つ,コンマで区切られて並んでいます。この部分は「引数(ひきすう)」と呼ばれています。引数は,計算に使う数を入れるための変数です。
右に寄ったプログラムの1行目は,先ほどと同じで計算式が書かれています。計算の変数は,丸括弧の中に書かれたのと同じ名前ですね。結果を代入したBMIという名前の変数は,次の行の「return」の後にもう一度書かれています。
定義した関数を使ってみましょう。身長162cm,体重53Kgの場合のBMIを計算してみます。

BMIを計算する(1.62, 53)

プログラムを実行すると,「20.195…」という結果が表示されます。変数と計算式でBMIを計算したプログラムで,変数に代入する数を同じように書き換えてみると,同じ答えになります。このことと,プログラムの見た目から,関数の中でも同じ計算が行われていることが類推できます。関数は,計算をするプログラムを動かすための「別の書き方」なのです。
関数名に丸括弧を続けて数を書く,というのが関数を使うための基本です。括弧の中に書いた数は,自動的に引数に代入されます。引数は関数の中では変数と同じように振る舞い,計算式のプログラムで利用されます。計算の結果は,関数から数として「返って」きます。
関数を使うことを「呼び出す」といいます。中に書いてあるプログラムを呼び出して,計算結果を得るのです。

計算モデル

関数を呼び出して計算をするスタイルには,プログラムがシンプルになるという利点があります。関数名を見れば,どんな「計算モデル」が使われているのかがひと目で分かるからです。

円の面積を計算する(10)

これは架空の関数を使ったプログラムなので,Pythonに実行させようとするとエラーになります。でも,「関数名に続けて丸括弧を書き,中には計算に必要な数を入れる」というルールを知っていれば,このプログラムを読んで意味を知ることができます。10を二乗してπを乗じる計算をすることになるので,円周率を3.14とすると,この関数は「314」という答えを返してくるはずです。

台形の面積を計算する(10, 20, 5)

台形の面積を求める公式「(上底+下底)×高さ÷2」を知っていれば,関数名から計算モデルを類推することができます。しかし,引数として与えられた三つの数のうち,「上底」「下底」「高さ」はそれぞれ何番目に当たるかが分からなければ,関数を使って台形の面積を計算することはできません。
関数の中で行われいている計算の種類によって,引数の数や種類は異なります。引数が一つまでの場合はいいのですが,引数が複数ある場合は,何番目にどんな種類の数を与えるのかが分からないと,関数を正しく使うことができません。
関数の近くに「# 上底,下底,高さ」と書いてあったら,引数のどの位置にどの数を与えればいいかが分かります。関数はたいてい,このような「仕様」に関する情報を伴っています。関数を定義しているプログラムを読むことも,関数の仕様を知るための手がかりになることがあります。
関数の仕様を知ることはとても重要です。なぜなら,関数は作るより使う方が圧倒的に多いからです。関数の作り方について解説しましたが,初心者のうちは特に,関数を作ることはめったにありません。出来合いの便利な関数を持ってきて,使う方が圧倒的に多いのです。Pythonでは,定義せずに使える便利な関数が数多く用意されています。そのような関数を上手に使うと,目的のプログラムを簡単に作り上げることができます。

次の記事に続く

応援,拡散よろしくね!


この記事が気に入ったらサポートをしてみませんか?