はじめての Python プログラミング

この Notebook は,

のプログラミング部分に相当する内容を,JavaScript のかわりに Python を使って書いてみたものです。

このテキスト第7章および第8章の内容は,2021年更新の HEROIC 2021 には対応していません。

そこで,これまでこのテキスト第8章を利用した授業を行なってきた方々のための移行支援として,同等の内容を,Jupyter Notebook による Python を使って実現する例を解説しています。

章番号はオリジナルの従来テキストに対応するように8章からはじめていますので,従来テキストを使用して授業を展開してきた教員や受講学生にも対応がわかりやすいかと思います。

また,テキストや授業と関係なく,初めて Jupyter Notebook で Python を利用する学生や教職員にとっても参考になるかも知れません。

この Notebook では,プログラミング言語としての共通部分に焦点を絞って解説します。より発展的な Python の活用例については,最終節のリンクを参照してください。

では,はじめましょう。

はじめてのプログラミング

エンゲル係数とは,家計の消費支出に占める飲食費(食料費,食費)の割合(パーセント単位)です。

消費支出 100,000円,飲食費 40,000円の人のエンゲル係数を求める例。Python では以下のような電卓的な使い方ですぐ答えが出ます。

本稿のように Jupyter Notebook 環境では,以下の1行を書いたあとに,Shift キーを押しながら Enter キー(または Return キー)を押して実行します。

In [1]:
40000/100000 * 100
Out[1]:
40.0

ここからは,単に電卓的に使うだけではなく,応用・発展も見据えて以下のようなプログラム文を作成して実行することにします。

以下の例では,

  1. 1行目で変数 s1 に消費支出である 100000(円)という数値を代入し,
  2. 2行目で変数 s2 に飲食費である 40000(円)という数値を代入し,
  3. 3行目でエンゲル係数を計算して,変数 x1 に代入し,
  4. 4行目でエンゲル係数の値 x1 を表示させています。
In [2]:
s1 = 100000
s2 = 40000
x1 = s2*100/s1
print(x1)
40.0

エラーとデバグ

意に反して,プログラムがうまく動作しない場合があります。たとえば,上記の 3行目を以下のように書いた場合。

掛け算を示す演算子は *,割り算を示す演算子は / であるところを誤って,×÷ と書くと,これらの記号は Python では演算子として定義されていないのでエラーとなります。このようなエラーは文法エラー(SyntaxError) と呼ばれ,Jupyter Notebook では,以下のように誤りやその箇所を指摘してくれます。

In [3]:
s1 = 100000
s2 = 40000
x1 = s2 × 100 ÷ s1
print(x1)
  File "<ipython-input-3-8a8157b3249a>", line 3
    x1 = s2 × 100 ÷ s1
            ^
SyntaxError: invalid character in identifier

別の種類の誤りもあります。たとえば,「100」を「1000」と入力した場合...

In [4]:
s1 = 100000
s2 = 40000
x1 = s2 * 1000 / s1
print(x1)
400.0

上記の例では SyntaxError (文法エラー)の警告が出ませんが,答えは明らかに変です。(エンゲル係数の最大値は100だから。)

このような場合はコンピュータにとって誤りではなく,指示通りに計算し,その結果を表示します。 このようなプログラム作成者の不注意や勘違いによって生じるエラーには注意が必要です。

プログラムが正しく動作しない場合は,誤りの箇所を探し,修正して再度動作を確認します。正しく動作するようになるまで,プログラムを修正し,実行(Shift + Enter)します。この作業をデバグといいます。

データの型と変数

上記の例の 1行目では,s1 という名前の変数に 100000 という 数値を代入しています。変数名はアルファベットで始まる英数字列にします。大文字と小文字は区別されます。

変数 ss に文字列を代入する場合は,以下のように " で囲みます。

In [5]:
ss="エンゲル係数"
print(ss)
エンゲル係数

式と演算

掛け算を示す演算子は *,割り算を示す演算子は /。足し算は +,引き算は - です。

+ は文字列の連結演算にも使います。以下の例を参照。

In [6]:
x0 = "エンゲル"
y0 = "係数"
z0 = x0 + y0
print(z0)
エンゲル係数

文字列と数値を直接連結することはできません。

In [7]:
s1 = 100000
s2 = 40000
x1 = s2*100/s1
z1 = "エンゲル係数は " + x1
print(z1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-8e6109a6f41f> in <module>
      2 s2 = 40000
      3 x1 = s2*100/s1
----> 4 z1 = "エンゲル係数は " + x1
      5 print(z1)

TypeError: can only concatenate str (not "float") to str

そんなときは,str() 関数で数値を文字列に変換して連結します。

In [8]:
s1 = 100000
s2 = 40000
x1 = s2*100/s1
z1 = "エンゲル係数は " + str(x1)
print(z1)
エンゲル係数は 40.0

print() のところは,文字列にして連結しなくても,以下のようにも書くことができます。 print() 文は,カンマ (,) で区切ることによって複数の項目(変数)を表示することができます。

In [9]:
s1 = 10000
s2 = 4000
x1 = s2*100/s1

print("エンゲル係数は", x1)
エンゲル係数は 40.0

主な演算子

加減乗除の演算子 +, -, *, /

優先的に計算したい箇所は丸括弧 ( )で グループ化します。

In [10]:
2 + (50 - 5 * 6)/4
Out[10]:
7.0

除算 / は常に浮動小数点数を返します。 // 演算子は 整数除算を行い、(小数部を切り捨てた) 整数値を返します。剰余は、% で求めます。 冪乗は ** です。

In [11]:
17 / 3
Out[11]:
5.666666666666667
In [12]:
17 // 3
Out[12]:
5
In [13]:
17 % 3
Out[13]:
2
In [14]:
2**4
Out[14]:
16

対話型プログラム

上記の例では,プログラムの中で消費支出や飲食費を決めていましたが,今度はプログラムを実行する人が入力できるようにしてみます。

input() 関数は入力された「文字列」を返すので,数値として計算するために float() で数値(浮動小数点数)に変換します。

In [15]:
s1 = input("消費支出? ")
s2 = input("飲食費? ")
x1 = float(s2)*100/float(s1)
print("エンゲル係数は", x1)
消費支出? 100000
飲食費? 40000
エンゲル係数は 40.0

関数の定義と呼び出し

(これまでの例では1回しか計算していませんが)よく使う計算を「関数」として定義する例です。

以下の例では,1行目から4行目でエンゲル係数を計算する関数 calc() を定義し,8行目でその関数を呼び出しています。

なお,""" で囲まれた文字列は「ドキュメンテーション文字列(docstring)」と呼ばれる関数の説明文です。 # から始まる行はコメント(実行に影響しない注釈)です。

In [16]:
def calc(s1, s2):
    """ 消費支出 s1 円と飲食費 s2 円からエンゲル係数を計算する。"""
    # 念のために,s1 と s2 を数値(浮動小数点数)に変換して計算します。
    return float(s2)*100/float(s1)

s1 = input("消費支出? ")
s2 = input("飲食費? ")
x1 = calc(s1, s2)
print("エンゲル係数は", x1)
消費支出? 100000
飲食費? 40000
エンゲル係数は 40.0

いったん定義された関数は,以下のように何回でも利用できます。

In [17]:
calc(120000, 53000)
Out[17]:
44.166666666666664

(練習)

消費支出を入力すると,エンゲル係数が 20 ~ 40 となる飲食費を表示するプログラムをつくりなさい。

数学関数を使う

$\sin x, \cos x, \tan x$などの数学関数を使う場合は,以下のように使う前に math モジュールを import します。(最初に1回だけ import すれば,それ以降は一々 import する必要はありません。)

In [18]:
import math

エンゲル係数を計算する部分はすでに関数 calc() として定義していますが,プログラム全体を関数 engel() として定義してしまいます。

In [19]:
def engel():
    s1 = input("消費支出?")
    s2 = input("飲食費?")
    x1 = calc(s1, s2)
    print("エンゲル係数は", math.floor(x1), "です。(小数点以下切り捨て)")
In [20]:
engel()
消費支出?120000
飲食費?47000
エンゲル係数は 39 です。(小数点以下切り捨て)

上記の例では,x 以下の最大の整数を与える関数 math.floor を使って,小数点以下を切り捨てたエンゲル係数の値を表示させています。

math で使える数学関数

import math で使える数学関数や数学定数については,以下のマニュアルのページを参照してください。

(練習)

小数点以下を切り上げたエンゲル係数の値を表示させるように上記のプログラムを変更しなさい。

ヒント: math --- 数学関数math.ceil を参照。

参考:数値の丸めと四捨五入

Python の組み込み関数に round() があります。数値を丸める関数ですが,いわゆる四捨五入とはちょっと違うようです。

以下の例からわかるように,小数点以下が 0.5 未満の場合と 0.5 を超える場合は四捨五入と同様の丸め方ですが,ちょうど 0.5 のときは,偶数に丸められていることがわかります。

これを偶数への丸めといい,端数が 0.5 より小さいなら切り捨て,端数が0.5 より大きいなら切り上げ,端数がちょうど 0.5 なら切り捨てと切り上げのうち結果が偶数となる方へ丸めます。

In [21]:
round(12.49), round(12.50), round(12.51)
Out[21]:
(12, 12, 13)
In [22]:
round(13.49), round(13.50), round(13.51)
Out[22]:
(13, 14, 14)

(練習)

四捨五入した値を表示する関数をつくりなさい。

条件分岐

条件分岐とは,例えばエンゲル係数の値によって実行文を変えることです。例を示します。

関数 engel() を以下のように変更します。

In [23]:
def engel():
    s1 = input("消費支出? ")
    s2 = input("飲食費? ")
    x1 = calc(s1, s2)
    if x1 >= 80:
        print("エンゲル係数は", math.floor(x1), "です。飲食費を使いすぎです。")
    else:
        print("エンゲル係数は", math.floor(x1), "です。")       
In [24]:
engel()
消費支出? 100000
飲食費? 80000
エンゲル係数は 80 です。飲食費を使いすぎです。
In [25]:
engel()
消費支出? 100000
飲食費? 40000
エンゲル係数は 40 です。

条件分岐の if 文の書式は以下のようになっています。

if 条件式 1:
    条件式 1 が満たされた場合に実行する文
elif 条件式 2: 
    条件式 2 が満たされた場合に実行する文
else:
    それ以外の場合に実行する文

(練習)

上記の条件分岐を,エンゲル係数が

  1. 80 以上の場合には「飲食費を使いすぎです。」
  2. 80 未満 40 以上の場合には「正常です。」
  3. 40 未満の場合には「もっと食べましょう。」

と表示させるように変更しなさい。

繰り返し処理

以下の例では,1行目で代入された消費支出に対してエンゲル係数を計算します。

1回だけ計算して表示するのではなく,2行目の飲食費の初期値(ここでは 40000 円)から,5行目の条件式(ここでは 80000 円以下)が成り立つ場合に,8行目にあるように 5000 円ずつ増やしながらエンゲル係数を表示します。

In [26]:
s1 = 100000
s2 = 40000
print("消費支出",s1,"円に対するエンゲル係数の値")

while s2 <= 80000:
    x1 = calc(s1, s2)
    print("   飲食費", s2, "円の場合: ", x1)
    s2 = s2 + 5000
消費支出 100000 円に対するエンゲル係数の値
   飲食費 40000 円の場合:  40.0
   飲食費 45000 円の場合:  45.0
   飲食費 50000 円の場合:  50.0
   飲食費 55000 円の場合:  55.0
   飲食費 60000 円の場合:  60.0
   飲食費 65000 円の場合:  65.0
   飲食費 70000 円の場合:  70.0
   飲食費 75000 円の場合:  75.0
   飲食費 80000 円の場合:  80.0

while 文の書式は以下の通りです。

while 条件式:
    条件式が成り立つ場合に実行する式

同様の繰り返し処理を for 文を使って行うこともできます。

Python では,以下の例の4行目のように for 文と range() 関数を使って書きます。他のプログラム言語になれていると少しとまどうかも知れませんが,80000 の場合は表示されません。

In [27]:
s1 = 100000
print("消費支出",s1,"円に対するエンゲル係数の値")

for s2 in range(40000, 80000, 5000):
    x1 = calc(s1, s2)
    print("   飲食費", s2, "円の場合: ", x1)  
消費支出 100000 円に対するエンゲル係数の値
   飲食費 40000 円の場合:  40.0
   飲食費 45000 円の場合:  45.0
   飲食費 50000 円の場合:  50.0
   飲食費 55000 円の場合:  55.0
   飲食費 60000 円の場合:  60.0
   飲食費 65000 円の場合:  65.0
   飲食費 70000 円の場合:  70.0
   飲食費 75000 円の場合:  75.0

補足:range() 関数と for 文

range() 関数を使った for 文の書式は以下の通りです。開始値を省略すると 0 とみなし,増分を省略すると 1 とみなします。

for i in range(開始値, 終端値, 増分):
    i が開始値以上,終端値未満の場合に実行される文

以下の range(5) とした例を参照してください。

In [28]:
for i in range(5):
    print(i)
0
1
2
3
4

(練習)

上記の for 文を使った繰り返しのプログラムで,飲食費 80000 円のエンゲル係数まで表示させるように変更してください。

(練習)

以下の値を求めるプログラムを作成せよ。

$$\sum_{n = 1}^{10} n^2$$

さらに Python を活用するために

この Notebook では,プログラミング言語として共通の部分に焦点を絞った Python の使い方について解説しました。

さらに発展的な Python の活用例については,以下のページを参考にしてください。

また,本家サイトのドキュメントは以下から。