式と評価

32.2. 式と評価

数の計算を中心に、Python の機能のなかの、簡単な一部を紹介します。

基本的なプログラムは (expression) と 評価 (evaluation) という枠組みで理解することができます。 比較的少ない規則で全体を把握できるため、HWBではここから説明を始めます。 他に、print など から紹介する流儀もあります。

セル #

先に 12.5. Colabを使った演習 でColab の基本を学び、セルに 3 + 5 と記入して実行すると 8 という結果を得られることを体験しました。

毎回スクリーンショットで示すことは煩雑なので、次の長方形領域のような略記を併用します。 3 + 5 の部分がセルへの入力、8 が実行後の応答と対応します。

3 + 5
8

算術式と演算子 #

Python のプログラムの書き方を、まず、「式を評価して値(あたい)を知る」という枠組みで紹介します。 先ほどの 3 + 5 を式、8 が値に対応します。まず、このような四則演算の範囲で式を考え、その後、拡張します。

四則演算は Python の式として概ね有効な文法です。このことを、 として理解してみましょう。

まず、式とは「次の(1)または(2)である」と考えます。これは、Pythonの厳密な定義ではなく、考え方の紹介のためのものです。

(1) 原始式 (atom)
数そのもの (e.g., 3, 5, 3.1415)
(評価した値は自分自身)
(2) 式と演算子の適切な組合せ
e.g., (3+5), (1+(2+3))

(1)より数そのものは式です。(2)から、(3+5) は、3, 5 は原子式として式で、また2項演算子 + による適切な組み合わせとして、(3+5) も式です。(1+(2+3)) はもう少し複雑ですが、内側の (2+3)は先ほど同様に式ですから、全体は (1+式) という形になり、これもまた2項演算子 + による適切な組み合わせとして式になります。(2)の定義内に「式」が含むことので、このように式を組み合わせた式を作成することができます。式を構成する式を 部分式 とも言います。

定義の (2) で、何が「適切な組み合わせ」かは、個々のプログラミング言語で異なります。 計算で必要な演算子を、表から探して使ってください。
2項演算子 意味
+ 加算
- 減算
* 乗算
/ 除算
// 整数除算
% 剰余
** 冪乗
単項演算子 意味
-
+
式を評価して得られる値は、演算子により変わります。上記の演算子は常識と整合するように定められています。
\( \underbrace{\underbrace{(3+5)}_{8}*2}_{16}\)
\( \underbrace{-\underbrace{(-5)}_{-5}}_{5}\)
演算子の前後には、読みやすさのために空白を入れて (3 + 5) のように表記することが勧められています。意味は変わりません。 また、意味が明確なところでは2項演算子の括弧を省略できます。つまり、((1 + 2) + 3)1 + 2 + 3 と書けますし、 4 + 5 * 6 は、乗算が優先して (4 + (5 * 6)) の略記です。

練習として、自分で式を作ってColabで実行し、Python の評価結果が自分の計算と一致することを確認しましょう。

(3 + 5) * 2
16
--5
5

(-(-5)) の意味となる

定数 #

\(\pi\) など数学の定数を使うこともできます。

準備として、右のセルを実行してください。これは math モジュールを import する意味なのですが、この文法の説明は後回しにします。これ以降 math に関する機能を利用可能になります
import math
なぜ初めから全部の機能を使えないのか?

Pythonには math 以外にも多数のモジュールが用意されていて、通常のプログラムではその一部の機能のみを使います。必要な機能のみ import することで、メモリの節約や起動の高速化になります。

The Python Standard Library

円周率は math.pi, 自然対数は math.e で定義されています。 円周率の2倍を表す式はは、2 * math.pi と書けます。

なお、実数の表現や演算では数値誤差が生じ得ます。実用に使う場合は、精度に注意してください。

14.2.2. 浮動小数点数

math.pi
3.141592653589793
2 * math.pi
6.283185307179586

このような定数を扱えるように、式の定義を次のように更新します。定数は、原子式です。

(1) 原始式 (atom)
  • 数そのもの (e.g., 3, 5, 3.1415)
  • [New!] 定数 (e.g., math.pi, math.e)
    (評価した値は自分自身)
(2) 式と演算子の適切な組合せ
e.g., (3+5), (1+(2+3))
定数を自分で作ることもできます。右のセルでは、radius (半径) という定数が 10 という数を表すように設定しています。この文法の紹介も後回しにします。
radius = 10
その後は、radious を使った式を使えるようになります。
radius
10
radius * 2
20
定数を含む式の評価も、これまでと同様です。
\( \underbrace{\underbrace{(2 * \underbrace{\texttt{math.pi}}_{3.1415\ldots})}_{6.2831\ldots} * \underbrace{\texttt{radious}}_{10}}_{62.831\ldots}\)

関数 #

関数も式を構成する要素です。

右の例は、math.floor という関数で、3.14 の小数点以下を切り捨てた値を求めています。
math.floor(3.14)
3
右の例は、math.gcd という関数で、192 と 324 の最大公約数を計算しています。
これらの関数は、あらかじめ、Python で用意されています。
math.gcd(192, 324)
12

自分で関数を定義することもできます。

右のような数学の関数に対応する Python の関数を作成し、計算してみましょう。
\(f(x) = x^2 + 100\)
f(0) 100
f(5) 125

左のセルが Python での f(x) の定義です。このセルを実行後は、Pythonの処理系が関数 \(f(x)\) を認識しれ、右のような計算が可能になります。

def f(x):
    return x ** 2 + 100
f(0)
100
f(5)
125

関数定義の基本パターン

def 関数名(x):
    return xを使う式 

上記の例は、関数名は f 1文字で、xを使う式x ** 2 + 100 でした。 関数名には、長い名前を使うこともできます。当面はアルファベット小文字 5文字前後で名前をつけることをお勧めします。

厳密さ注意 — 上記のパターンの一部は一字一句厳密に入力する必要があります

  • パターン中の def : return は一字一句このまま
  • return の左に、スペース (空白文字) を 4つ

関数の引数は、2つ以上持つことができますし、名前も自由につけることができます。 引数は、ひきすう、 \(\sim\) 変数)} と読みます。

関数定義の基本パターン(改)

def 関数名(引数1, 引数2, ...):
    return 引数を使う式
たとえば加算の関数 add(a, b) は、右のように定義します
def add(a, b):
  return a + b
関数を含む式の評価は、引数に対応する式の値を先に評価し、続いて関数で return する式の中の変数を置き換えて計算します
\( \underbrace{\underbrace{\underbrace{\texttt{add}(\underbrace{1+2}_3, 5)}_{a+b|_{a=3, b=5}}}_8*2}_{16}\)
add(1+2, 5) * 2
16

ここまでで、式の定義は次のように拡張されました。

(1) 原始式 (atom)
  • 数そのもの (e.g., 3, 5, 3.1415)
  • 定数 (e.g., math.pi, math.e)
    (評価した値は自分自身)
(2) 式と演算子の適切な組合せ
e.g., (3+5), (1+(2+3))
(3) [New!] 関数
e.g., math.floor(3.14), add(1+2, 3)
Colab 式と評価 文字列と式