コンピュータ演習II 第02回 変数・型・演算¶

この回では、プログラミングの最も基本となる 変数 と、変数がもつ 型、そして数値や文字列の 演算 を学びます。これらは第03回以降で扱うすべての内容の土台になります。
第01回で確認した Colab を使って、実際にコードを書いて実行しながら読み進めてください。

1. 変数と型¶

1.1 変数の基本¶

変数の簡単な解釈:数値や文字列などの情報を入れる箱

  • 数値:1, 124, 3.14 など
  • 文字列:"Hello", "こんにちは" など(ダブルクォーテーション(")で囲みます)

例えばa という変数に10 という情報を入れる場合、以下のように記述できます。

In [1]:
a = 10
変数 a を箱に見立て、右辺の値 10 を矢印で箱に入れる(代入する)図

= という記号は数学とプログラミングとでは解釈が違います。

  • 数学:左辺と右辺は等しい
  • プログラミング:左辺に右辺を代入する

つまり、上記のプログラムは10 という情報を変数a に代入する、という解釈になります。
変数a に代入された値を出力したい場合にはprint 関数を以下のように使います。

In [2]:
print(a)
10

ここで使ったprint は、Python に最初から用意されている関数の一つです。
関数とは 入力を受け取り、その入力に応じた出力を返すしくみ です。
数学における関数は、例えば$f(x) = x^2$ が $x=2$ に対して $4$ を返す、といったもので、プログラムにおける関数も同じイメージです。 ただし、プログラムの関数は数学よりも自由度が高く、print のように「受け取った値を画面に表示する」といった働きを持たせることもできます。

print の後につけた() に変数を入れると、その中身が出力されると覚えてください。
上の例では数値を変数に代入していますが、文字列も変数に代入することができます。

In [3]:
s = "Hello world!"

このプログラムは変数s に文字列"Hello world!" という情報を代入しています。
なおプログラミングにおいて文字列を扱う場合には必ずダブルクォーテーション(")で文字列を囲みます。
ではprint 関数を使って変数s の中身を見てください。

In [4]:
print(s)
Hello world!

print 関数について¶

これまでのコードでは一つの変数をprint 関数を用いて出力しました。
しかし、以下のように() 内で変数をカンマ(,)により区切ることで複数の変数を同時に出力することができます。

In [5]:
print(a, s)
10 Hello world!

他にもprint 関数に数値や文字列をそのまま渡すこともできます。

In [6]:
print(10)
print("Hello world!")
10
Hello world!

これらを組み合わせて、以下のようなコードを書けば変数の出力を見やすくすることができます。

In [7]:
print("a =", a, ", s =", s)
a = 10 , s = Hello world!

変数の命名¶

変数の命名は面倒くさくてもよく考えて行ってください。
長いコードになると意味のない変数名は混乱のもとになります。
今回は無意味な文字を使っていますが、推奨されないことなので気を付けてください。

例えば、何かの最大値を代入する変数であればmax_value のように、誰かが見たときにその変数がどのような役割を持っているかわかるように命名することが望ましいです。

以下に簡単な命名規則を示しますのでよく読んでください。

  • 頭文字に数字は使えません
    ○ a1, a2 , × 1a, 2a

  • スペースは使えません。(アンダースコア(_)で代用してください)
    ○ max_value, min_value , × max value, min value

  • 予約語(あらかじめPython の機能として使われている単語など)は使えません
    × print など、今後出てくる機能は変数名として使えません

  • アンダースコア(_)以外の記号は使えません
    × max-value, max.value

練習: 自分の情報を変数に格納してください¶

自分の氏名と学籍番号後半5 桁を、それぞれ文字列・整数として変数に格納し、print 関数を使って氏名と学籍番号を一度に出力するコードを書いてください。

In [ ]:
my_name = "???"      # ← 自分の氏名(文字列)に書き換えてください
student_id = 0       # ← 学籍番号後半5 桁(整数)に書き換えてください

# print 関数で my_name と student_id を一度に出力するコードを書いてください

発展: 自分のプロフィールを出力してください¶

氏名(文字列)、年齢(整数)、学籍番号後半5 桁(整数)の3 つを別々の変数に格納し、print 関数1 回の呼び出しで「氏名: 〇〇、年齢: 〇〇、学籍番号: 〇〇」のような形で出力するコードを書いてください。

In [ ]:
my_name = "???"      # ← 自分の氏名(文字列)に書き換えてください
my_age = 0           # ← 自分の年齢(整数)に書き換えてください
student_id = 0       # ← 学籍番号後半5 桁(整数)に書き換えてください

# print 関数 1 回の呼び出しで「氏名: 〇〇、年齢: 〇〇、学籍番号: 〇〇」のような形で出力してください

1.2 変数の型¶

前項では何の断りもなく変数に数値や文字列を代入しました。
しかし、変数には"型"と呼ばれる性質があります。

型はその変数に入る値の種類を示すものです。
そのため、数値を入れる型である変数と文字列を入れる型である変数は区別しなければなりません。

具体的に前項で使った変数a とs の型を確認してください。
(type は変数や値の型を確認するための関数です。)

In [8]:
print("a の型は", type(a), "、s の型は", type(s))
a の型は <class 'int'> 、s の型は <class 'str'>

<class '???'> の??? が型を示します。
そのため、出力を見ると変数a の型はint、変数s の型はstr であることがわかります。
いきなり変数の型がint だ!とかstr だ!とか言われてもわからないと思いますので、型と型名、その意味を以下の表にまとめます。

型 型名 値の例 備考
int 整数型 10, 128, 100000 小数点を含まない数
float 浮動小数点数型 0.1, 3.141592, 2.71828 小数点を含む数
str 文字列型 "Hello", "こんにちは", "10", "0.1" 数値も" で囲めば文字列として扱われます
int に 10、float に 3.14、str に Hello がそれぞれ箱に入っている図。箱の中身の種類が型を表す

上の表によれば変数a、s はそれぞれ整数型、文字列型であることがわかります。
実際にa には10 という整数が入っており、s には"Hello world!" という文字列が入っています。

変数の初期化¶

変数を新たに用意(これを変数の定義といいます)する場合には、初期化と呼ばれる操作が推奨されます。
整数型の変数を用意するのであれば、あらかじめ整数とわかるように定義する必要があります。
例えば整数を格納する変数a を定義するのであれば以下のようにします。

In [9]:
a = 0

上の例では変数a に整数である0 を代入することで、a が整数を格納する変数であることが示唆されます。
一般的に整数変数は0 を代入することで定義することが多いです。

以下の表は型ごとに初期化によく使われる値を示します。

型 型名 初期化に使われる値 備考
int 整数型、またはint 型 0 小数点を含まない数であることを明示します
float 浮動小数点数型、またはfloat 型 0.0 小数点を含む数であることを明示します
str 文字列型、またはstr 型 "" 空の文字列という意味

なお、変数を定義する段階で代入する値がすでに決まっている場合には、上記表の値を代入する必要はありません。

型の変換¶

変数a に格納した10 という整数は10.0 と表記すると浮動小数点数型とみなすことができます。
確認のため10 と10.0 という値の型を確認してください。

In [10]:
print(type(10), type(10.0))
<class 'int'> <class 'float'>

このように同じ値でも表記を変えると型が変わります。
整数型となっている10 という値は"キャスト"と呼ばれる操作を行うことでfloat 型に変換できます。
キャストは変換したい値を型名の後につけたかっこの中に記述すると実現できます。
すなわち、float(10) とするとint 型の10 をfloat 型に変換する、という意味です。

In [11]:
print(float(10))
10.0

同じように浮動小数点数型である10.0 をint 型に変換することもできます。

In [12]:
print(int(10.0))
10

このキャストと呼ばれる操作は変数に対しても行うことができます。
試しに整数型の変数a を浮動小数点数型に変換してください。

In [13]:
a = 10
b = float(a)

上のコードは左辺(b) に右辺(float に変換された変数a)を代入しています。
変数a とb の中身と型を確認してください。

In [14]:
print(a, type(a))
10 <class 'int'>
In [15]:
print(b, type(b))
10.0 <class 'float'>

この通り、int 型であった変数a がfloat 型に変換されていることがわかります。

この操作は(条件を満たせば)他の型に対しても行うことができます。
例えば以下のような変数を定義します。

In [16]:
pi_str = "3.14"
print(pi_str)
3.14

出力を見ると一見float 型のように思えますが、3.14 を" で囲っているためこれは文字列です。
実際に確認してください。

In [17]:
print(type(pi_str))
<class 'str'>

この変数pi_str は文字列型ですが、その文字列はfloat 型とも解釈できますので、キャストを行うことでfloat 型に変換可能です。

In [18]:
pi = float(pi_str)
print(pi, type(pi))
3.14 <class 'float'>

一方で変換できないケースもあります。
変数s は"Hello world!" という値を持つ文字列型の変数ですが、この値はfloat 型とは解釈できません。
そのためキャストを行おうとするとエラーとなります。

In [19]:
t = float(s)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[19], line 1
----> 1 t = float(s)

ValueError: could not convert string to float: 'Hello world!'

上のような赤文字のエラーメッセージは、Python が処理を続けられないときに表示されます。
末尾のValueError: could not convert string to float: 'Hello world!' がエラーの種類と原因を示しており、これは「文字列をfloat に変換できなかった」ことを意味します。
このようなエラーに遭遇したときは、エラーの種類と原因を読むことが解決の第一歩です。

(おまけ)型の宣言¶

Python では変数の型を明らかに示すことはありません。
これまでの例でも10 や0 という数値を変数に代入するとその変数は勝手にint 型になっていました。
しかし、想定される変数の型と実際の型が異なるとエラーの原因になりますので、変数の型は常に意識しなければなりません。

参考までに、例えばC 言語では以下のように型を指定(宣言ともいいます)して変数を定義します。

int c = 0;

このように、他の多くのプログラミング言語では変数の型を明示するのが一般的です。
Python では型を明示する必要はありませんが、変数の型は内部的にきちんと存在していますので、定義した変数の型が何であるのか、意識するようにしてください。

練習: キャストで型を変換してください¶

次の2 つのキャストを行い、それぞれ print 関数と type 関数で値と型を確認するコードを書いてください。

  • 整数 7 を float 型に変換する
  • 文字列 "3.14" を float 型に変換する
In [ ]:
# 整数 7 を float 型に変換した変数を作り、値と型を print 関数と type 関数で確認してください
# 文字列 "3.14" を float 型に変換した変数を作り、値と型を print 関数と type 関数で確認してください

発展: 型を行き来させてください¶

整数 7 を str 型に変換し、その文字列をさらに int 型に戻すコードを書いてください。もとの整数、str にしたもの、int に戻したものの3 つについて、それぞれ print 関数と type 関数で値と型を確認してください。

In [ ]:
# 整数 7 を str 型に変換した変数を作ってください
# その文字列を int 型に戻した変数を作ってください
# もとの整数・str 版・int に戻したものの値と型を print 関数と type 関数で確認してください

2. 演算¶

2.1 数値同士の演算¶

数値同士の演算は次のように行います。

In [20]:
print(1 + 2, 1 - 2, 1 * 2, 1 / 2)
3 -1 2 0.5

各記号の意味は次のとおりです。

演算子 意味
+ 足し算
- 引き算
* 掛け算
/ 割り算

数値同士の演算は上記のように値同士で行うこともできますが、実際によく使われるのは変数同士の演算です。

In [21]:
a = 1
b = 2
print(a + b, a - b, a * b, a / b)
3 -1 2 0.5

通常、演算結果は変数に格納されます。

In [22]:
c = 0
c = a + b
print(c)
3

演算子の優先順位¶

数学と同様、プログラミング言語における演算子にも優先順位があります。
上に示した四つの演算子の優先順位は数学と同様です。

In [23]:
print(3 * 2 + 3, 3 - 6 / 3)
9 1.0

足し算、引き算を先に計算したい場合も数学と同様() を使って記述します。

In [24]:
print(3 * (2 + 3), 3 / (6 - 3))
15 1.0

演算子の順序が変わっても優先順位のルールが優先されます。

In [25]:
print(3 / 3 - 2)
-1.0

ただし、変数に対する掛け算と割り算の演算順序には気を付けてください。
例えば数式で

$\frac{8}{2x}$

とあったら$8$ を$2x$ で割る、という意味ですので、例えば$x=2$ であれば答えは$\frac{8}{4}=2$ です。
ここで、数式を見た通りコードで記述してみます。

In [26]:
x = 2
print(8 / 2 * x)
8.0

なぜか答えは2 になりません。
これは割り算と掛け算の優先順位が同じであるために先頭から計算を行っているためです。
そのため、このコードは8 / 2 * x = 4 * x = 8 というように計算されています。
このような場合は() を使って次のように記述しなければなりません。

In [27]:
print(8 / (2 * x))
2.0

練習: 計算結果の型を確認してください¶

整数同士の計算でも、計算の種類によって結果の型が変わります。整数 a = 10 と b = 4 に対して、a + b(足し算)と a / b(割り算)をそれぞれ別の変数に格納し、print 関数と type 関数で 値と型 を確認するコードを書いてください。足し算と割り算で、結果の型がどう違うかに注目してください。

In [ ]:
a = 10
b = 4

# a + b と a / b を計算して、それぞれ別の変数に格納してください
# それぞれの値と型を print 関数と type 関数で確認してください

発展: かっこと小数を含む計算¶

整数と小数を混ぜた計算もできます。(10 + 5) / 2(かっこの中を先に計算します)と 10 + 2.5(整数と小数の足し算)をそれぞれ別の変数に格納し、print 関数と type 関数で値と型を確認するコードを書いてください。整数だけの計算と、小数が混ざった計算とで、結果の型がどう変わるかに注目してください。

In [ ]:
# (10 + 5) / 2 と 10 + 2.5 をそれぞれ別の変数に格納してください
# それぞれの値と型を print 関数と type 関数で確認してください

様々な演算子¶

上では基本的な四則演算のみ紹介しましたが、多くのプログラミング言語では以下のような便利な演算子が用意されています。

演算子 意味 例 備考
** べき乗 2**2=4, 3**2=9 -
// 整数除算 3//2=1, 7//2=3 割り算の結果の整数部(商)のみを出力します
% 剰余 3%2=1, 7%2=1 割り算の余りのみを出力します

これらの演算子は意外と役に立つことがありますので、ぜひ覚えておいてください。

演算結果を格納する変数の初期化¶

1.2 項(変数の型)と関連しますが、演算結果はあらかじめ定義された変数に格納することを心がけてください。
例えば上の例では、整数型の変数a, b の足し算でありその演算結果も整数型であることは明白です。
そのため、演算結果を格納する変数c は0 を代入して定義されています。
これは引き算、掛け算についても同様の考え方ができます。

一方、変数a をb で割った結果は整数型とは限りません。
上の例でも演算結果は浮動小数点数型です。
そのため、数値同士の割り算を行うような演算結果を格納する変数は次のように浮動小数点数型で初期化された変数を用意してください。

なお、Python ではd = 0.0 のような初期化は必須ではなく、d = a / b だけでも動作します。本教材では 変数の型を意識する練習 として、このように初期化を明示する書き方を推奨します。

In [28]:
d = 0.0
d = a / b
print(d)
0.5

練習: 学籍番号を使った計算¶

自分の学籍番号後半5 桁(整数)を変数に格納し、その値に対して以下の計算をしてそれぞれ出力するコードを書いてください。

  • 7 で割った余り(% 演算子を使う)
  • 100 で割った商の整数部(// 演算子を使う)
  • 2 乗(** 演算子を使う)
In [ ]:
student_id = 0   # ← 学籍番号後半5 桁(整数)に書き換えてください

# % 、// 、** 演算子を使って計算し、結果を変数に格納して print で出力してください

発展: 学籍番号の各桁を取り出してください¶

自分の学籍番号後半5 桁(整数)から、1 の位・10 の位・100 の位の数字を% と// を組み合わせて取り出し、それぞれ別の変数に格納して出力するコードを書いてください。

ヒント:

  • 1 の位は「10 で割った余り」で求められます。
  • 10 の位は「10 で割った商の整数部」をさらに「10 で割った余り」で求められます。
In [ ]:
student_id = 0   # ← 学籍番号後半5 桁(整数)に書き換えてください

# % と // を組み合わせて、1 の位、10 の位、100 の位の数字をそれぞれ別の変数に取り出し、print してください

2.2 文字列の結合¶

一部の演算子は文字列にも適用できます。

In [29]:
s1 = "Hello"
s2 = "world!"

s = s1 + " " + s2
print(s)
Hello world!

上の例は演算子+ で文字列同士を結合しています。
また、文字列に対して演算子* を用いることで任意の回数文字列を繰り返すことができます。

In [30]:
s3 = s1 * 3
print(s3)
HelloHelloHello

練習: 氏名と学籍番号を文字列として組み合わせてください¶

自分の氏名と学籍番号後半5 桁をそれぞれ文字列として変数に格納し、以下を行うコードを書いてください。

  • 氏名と学籍番号を + 演算子で結合した文字列を変数に格納してください
  • その文字列を * 演算子で3 回繰り返した文字列を作って出力してください

例えば氏名が日大太郎、学籍番号が12345 であれば、出力は日大太郎12345日大太郎12345日大太郎12345 のようになります。

In [ ]:
my_name = "???"       # ← 自分の氏名
student_id = "???"    # ← 学籍番号後半5 桁(文字列として)

# 文字列の + 演算子で結合した文字列を作り、 * 演算子で3 回繰り返して出力してください

発展: 装飾された出力を作ってください¶

氏名と学籍番号後半5 桁を、以下のような形式の文字列として組み立てて出力するコードを書いてください。+ 演算子で文字列を結合します。

例えば氏名が日大太郎、学籍番号が12345 であれば、出力は=== 日大太郎 (12345) === のようになります。

In [ ]:
my_name = "???"       # ← 自分の氏名(文字列)
student_id = "???"    # ← 学籍番号後半5 桁(文字列として)

# `=== 氏名 (学籍番号) ===` の形式の文字列を + 演算子で組み立てて、print で出力してください