式と評価

20.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 式と評価 文字列と式