2.1 四則演算と変数

(1/1)
ENIAC
ENIAC
1946年(昭和21年)、世界最初のコンピュータ ENIAC (エニアック)  が、アメリカ陸軍の大砲の弾道計算を行うために開発された。厳密に言うと ENIAC はプログラミング可能なコンピュータではなかったが、1954年(昭和29年)、IBMのジョン・バッカスらにより、科学技術計算ができる世界最初のプログラミング言語 FORTRAN が考案された。
シャープ CS-10A
シャープ CS-10A
電卓が登場するのは、これより後、1960年代のことである。

このように、コンピュータとプログラミング言語は科学術計算からスタートした。
本章では Pythonで簡単なプログラムをつくることを目標に、四則演算にはじまり、変数の使い方や繰り返し処理、入出力とエラー対策、数学関数とユーザー定義関数を学ぶ。ここまで習得すれば、関数電卓やExcelよりも複雑な計算ができるようになる。

目次

サンプル・プログラム

四則演算

print(1 + 2)
"add1.py" は、\( 1 + 2 \) の計算結果を表示するプログラムだ。

前回、"hello.py" を表示するプログラムでは print関数の中のメッセージをダブルクォーテーション "..."で囲んだが、今回はそれがない。ダブルクォーテーション(またはシングルクォーテーション)で囲まないと、Pythonはそれを数式をみなして計算(評価)し、その結果を表示する。

計算に使う四則演算子があり、足し算はプラス +、引き算はマイナス -――この2つは算数と同じだ。
かけ算はアスタリスク *、割り算はスラッシュ / である。算数で習った演算子と違うので注意が必要だ。

\( 1 + 2 \) 以外にプログラムを書き換えたり、\( 1 + 2 + 3 \) のように3つ以上の足し算をしてみよう。

変数

たいていのプログラミング言語には変数という仕組みがあり、計算結果などを一時的に保存できる。ただし、プログラムを終了すると、その内容は消えてしまう。
先ほどのプログラムを改造し、\( 1 + 2 \) の計算結果を変数 c に保存し、その c の内容を表示するプログラム"add2.py" として作ってみる。= は、\( 1 + 2 \) の計算結果を変数cに代入するという意味で、等号ではない点に注意してほしい。
c = 1 + 2
print(c)
Python では、いきなり変数に代入することができる。他の言語では、変数を使う前に宣言を求めるものが多い。

変数名として使える文字は、プログラミング言語によって異なる。
Python では、半角英数字(大文字・小文字を区別する)、アンダースコア _ を変数名として使うことができる。ただし、冒頭文字に数字を使うことはできない。
また、次の名前は予約語として、変数名にすることができない。

変数名の付け方(命名規則)は、さまざまな考え方がある。会社によっては命名規則を定めているところもある。チームでプログラム開発するとき、その変数が何を意味するか一目で分かるようにするためだ。
方程式で使う係数のようなものは a, b, c‥‥、方程式における変数はx, yなどとすることが多い。また、整数はi(integer), j, k、またはn(number), m。メッセージ(文字列)はsで始まる英単語にすることが多い。
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
a = 1
b = 2
c = a + b
print(c)
"add3.py" では複数の変数a, b, cを利用する。実行結果は \( 3 \) である。
Python を含むプログラミング言語は、1つのプログラムの中で幾つも変数を使うことができ、変数に対して演算子を使うことで計算することができる。
試しに変数名を書き換えてみてほしい。

数値と数字

a = "1"
b = "2"
c = a + b
print(c)
"add4.py" は "add3.py" と同じ見えるが、実行結果は \( 12 \) である。
"add3.py" と異なり、数字の \( 1 \) と \( 2 \) をダブルクォーテーションで囲んでいるため、数値ではなく文字列(数字)として変数に代入されたのだ。文字列にプラス + 演算子を作用させると \( a + b \)、足し算ではなく、文字列の結合――つまり \( 1 \) という文字列と \( 2 \) という文字列を結合して \( 12 \) になる。

掛け算と演算子の優先順位

a = 2
b = 3
c = a * b
print(c)
"mul1.py" は単純な掛け算である。実行結果は \( 6 \) だ。
a = 2
b = 3
c = 4
d = a + b * c
print(d)
"mul2.py" は足し算と掛け算が混ざっている。算数で習ったとおり、掛け算、割り算は足し算、引き算より優先して計算する。よって、実行結果は \( 20 \) ではなく \( 14 \) になる。

割り算と小数

a = 1
b = 2
c = a / b
print(c)
"div1.py" は単純な割り算である。\( 1 \div 2 \) は割り切れるので 実行結果は \( 0.5 \) と表示する。整数と小数を区別するプログラミング言語もあるが、Python では整数と小数を区別せず計算することができる。
a = 7
b = 3
c = a / b
print(c)
"div2.py" も割り算だが、\( 7 \div 3 \) は割り切れないので \( 2.33333.... \) という循環小数として表示する。

ゼロ除算

a = 7
b = 0
c = a / b
print(c)
"div0.py" は、"div2.py" の2行目の変数bに代入する値を変えただけだが、算数で習ったように、割る数がゼロの割り算はできない。
"div0.py" を実行すると、画面に "ZeroDivisionError: division by zer" と表示する。プログラムの3行目で実行環境が致命的エラーを発生し、強制終了したのである。
エラー処理については追って説明するが、このようにプログラム自体にバグがなくても、入力する値によっては致命的エラーが発生することを覚えておいてほしい。

分数

数の概念
複素数実数有理数整数自然数\( 1, \ 2, \ 3 \)
ゼロ\( 0 \)
負の整数\( -1, \ -2, \ -3 \)
有限小数分数\( \displaystyle 0.5, \ \frac{3}{4} \)
循環小数\( \displaystyle \frac{1}{3} \)
無理数無限小数\( \displaystyle \sqrt{2}, \ \pi, \ \log2 \)
虚数\( \displaystyle 3i, \ -5i \)
多くのプログラミング言語で扱うことができる有理数は整数と小数だけなのだが、Pythonは標準で分数を扱うことができる。
from fractions import Fraction
a = Fraction(7, 3)
print(a)
b = 3
c = a * b
print(c)
"div3.py" で Fractionインスタンスは、\( \displaystyle \frac{7}{3} \) という分数を表わし、これを変数aに代入する。aの値は、画面には 7/3 と表示する。
次に、\( \displaystyle \frac{7}{3} \times 3 \) を計算し、計算結果は元通り \( 7 \) を得ることができる。
Fractionインスタンスについては、いずれ詳しく説明する。

剰余算

a = 7
b = 3
d = a % b
c = int((a - d) / b)
print(str(c) + '...' + str(d))
小学3年生の算数では「あまりの出る割り算」を習う。
Pythonには余りを求める剰余演算子 %(パーセント記号)が用意されており、これを使うと、\( 7 \div 3 \) が 2 あまり 1 であることを表示できる。"mod1.html" をご覧いただきたい。
まず剰余演算子を使って余り d を求める。次に、割られる数から余り d を引き算して割ってやれば、商 c を求めることができる。このとき、int関数を使って商 c を小数から整数に変換する。
最後に print関数を使って商と剰余を表示するのだが、商と剰余の予間に "..." を挟みたいので、strクラスを使って整数を文字列に変換してやってから結合する。

練習問題:四則演算と変数

次回予告

次回は、Pythonが備えている繰り返し処理を使って、1から10までの整数の和を求めるプログラムを作る。

コラム:プログラム電卓から人工知能へ

カシオ FX-502P
カシオ FX-502P
私が初めてプログラムらしいプログラムを作ったのは、1979年(昭和54年)のこと。まだパソコンが無かった時代で、中学生にとっては大型電算機にアクセスするつてもなく、生徒会ではタイガー計算器が現役だった。
そんな中、カシオのプログラム電卓「FX-502P」を購入した。「プログラム・ライブラリ」という分厚い書籍が同梱されており、基本的なアルゴリズムから統計処理まで、この書籍を読みながらプログラムを打ち込んで勉強した。
やがて、目的とするハレー彗星の位置予報プログラムが完成した。このあたりの経緯は「プログラム電卓『FX-502P』でプログラミングを学ぶ」で紹介している。
そういう意味では、私も科学技術計算からプログラミングを始めた人間である。その後、趣味で仕事で、様々なプログラミング言語を経験してきた。それぞれの言語には、プログラムを書くためのセオリー(文法)がある。が、大雑把に言うと、科学技術計算やデータ処理に向いているプログラミング言語の文法は、Pythonに似ている。

2024年(令和6年)現在、機械学習や人工知能が発展してきている。前回の人工知能ブームでは、エキスパートして有無を構築するために、論理型言語のPrologに注目が集まった。だが、エキスパートシステムの限界が見えてしまい、ニューラルネットワークが提唱された。これが約40年前のこと。現在の機械学習は、このニューラルネットワークの延長線上にある技術で、40年前には不可能だった大量のデータ処理が前提となっている。
将来、機械学習や人工知能で研究や仕事をする方は、きっと本シリーズで学んだ知識が役に立つだろう。
(この項おわり)
header