変数について学んでいきましょう。
変数
まずは具体例を見て、変数とは何かということについてイメージをふくらませましょう。
コード1 greeting = "Hello world!"
2 print(message)
アウトプットHello world!
コードの解説1 greetingという変数に"Hello world!"という文字列(データ)を代入しています。このコードではgreetingという変数名にしましたが、実際には「a」でも「b」でも「hello」でも構いません。
2 greetingという変数が参照しているデータを画面に出すよう命令しています。
変数は、中学校の数学と同じような感覚で使うことができますよね。
数学の「文字と式」という単元で、a = 5や、a x b = 10といった式を見た方も多いのではないかと思います。
ただし、データと代入という記事で、プログラミングにおける代入は「関連付ける」という意味であることをお伝えしました。
言い換えると、プログラミングにおけるa = 1というのは、1というデータとaとうい変数を関連付けることです。
そして、中学校の数学におけるa =1というのは、aに1を代入することです。
同じように感じるのですが、実はプログラミングにおけるa = 1と、数学におけるa = 1は全く違うものです。
そして、この違いをしっかりと理解せずにプログラミングの勉強を進めると、どこかで行き詰まってしまいます。
プログラミングにおける変数と、数学の変数の違いを理解することはとても重要ですので、その違いについてここから見ていきましょう。
※ちなみに、プログラミングでも=は代入するという言葉で表現することが一般的ですが、はじめのうちは(関連付ける)と考えた方がプログラミングの理解が深まります。
プログラミングにおける変数とは?
具体例で理解を深めていきましょう。
例えば、
コードa = 1
というコードがあったとします。
これは、aという変数と、1というデータを関連付けることです。
ここで、データに関連付けられる対象であるa、すなわち変数が何を意味しているのかということについて整理していきましょう。
プログラミングにおける変数というのは、データが格納されているメモリ上の場所(アドレス)のことです。
といっても、メモリもアドレスもよく分からないですよね。
つまり、残念ながらメモリとアドレスを理解しなければ、変数を理解することはできないのです。
また、メモリとアドレスを理解するためには、コンピューターの仕組みについて理解する必要があります。
また、メモリとアドレスについても、メモリとアドレスという記事で詳しく説明していますので安心して下さい。
ここでは、メモリとアドレスについて理解していることを前提に話を続けます。
a = 1というコードに戻りましょう。
このコードでは、aが変数であり、メモリ上のアドレスを示しています。
メモリとアドレスを意識しながら、以下のコードを見てみましょう。
コードa = 1
b = a + 5
数学の考え方をすると、aが1なので、a + 5(つまりb)は6になりますよね。
この時、コンピューターがこのコードをどのように処理しているのかを考えていきましょう。
変数aは、1というデータではなく、1というデータが入っているメモリ上の場所(アドレス)を示している(参照している)のです。
つまり、a + 5というのは、aという変数が参照しているメモリ上のアドレスに格納されているデータと、5というデータを足しなさい、ということなのです。
変数を使う理由
変数の考え方について理解していただいた上で、なぜ変数が生まれたのかという点について整理していきましょう。
(プログラミングを学ぶ上では、様々な機能は必要性に応じて誕生した。と考えた方が理解がしやすいです。
この点については、プログラミングを学ぶ前に身につけておきたい考え方という記事で詳しく説明していますので参考にして下さい。)
複数行のコードでデータを使い回せる
まずは、複数行のコードでデータを使い回せるということが挙げられます。
例えば、円周率として3.141592という数字(データ)があったとします。
ここで、1から5までの数字に円周率をかける、という計算が必要だったとしましょう。
この時、変数がなければ、このように計算をしなければいけません。
コード1 * 3.141592
2 * 3.141592
3 * 3.141592
4 * 3.141592
5 * 3.141592
パッと見ただけで、無駄が多いことが分かるかと思います。
ここで、π=3.141592としてみましょう。
変数の定義を振り返って考えてみると、データとしての円周率を必要な時に使えるようにするために、データにπという名前をつけたもの、と言うことができます。
πという変数を使うことによって、上記のコードはこのように書き換えることができます。
コード1 * π
2 * π
3 * π
4 * π
5 * π
コードがとてもスッキリしましたね。
変数πが3.141592というデータを参照していますので、πを使うことによってコードをスッキリとさせることができました。
人がデータを簡単に使い回すことができる
あるクラスの数学の点数をデータとして扱う場合を考えてみましょう。
コードtanaka = 90
ito = 87
mizuno = 95
fujita = 76
このようなデータがあった場合に、全ての生徒の数字を覚えておくのは効率が悪いですよね。
そうではなく、生徒の名前を変数として、その変数に点数を代入(関連付ける)ことによって、生徒の名前で必要とするデータを取り出すことができるようになりました。
これも変数を使うことのメリットです。
a = a + 1を理解する
変数と代入について少しイメージが湧いてきたでしょうか。
ここからは、変数の理解を更に深めていきましょう。
このようなコードがあります。
コードa = 1
a = a + 1
2行目のコードは、数学では馴染みがないですよね。なぜなら、数学ではa = a = 1という式は成立しないからです。
しかし、プログラミングの世界では、a = a + 1は成立します。
順番に整理していきましょう。
このコードの右辺から見ていきましょう。
ここでは、a + 1と、変数aにデータ1を足しています。
つまり、aは1というデータが格納されているメモリ上のアドレスを示します。
1行目の式ではa = 1としましたので、がaが参照するアドレスには1というデータが入っています。
つまり、右辺は1 + 1の演算結果である2となります。
この式の左辺は、1行目と同じくaですが、この2行目のaは、1行目のa、つまり1というデータが入っているアドレスではありません。
2行目のaは、2というデータが入っているアドレスを新たに示すようになるのです。
Pythonでは、コードは基本的に上から順番に実行されていき、順次上書きされていきます。
この例では、1行目にa = 1と、aと1を関連付けましたが、2行目でa=2と、aとが示すアドレスが上書きされたのです。
変数は参照、という考え方に基づいて考えると、a = a + 1というコードに対する理解が深まるのではないでしょうか。
違う例で考えてみる
もう少しイメージを沸かせるために、違う例で考えてみましょう。
このようなコードがあったとします。
コードπ = 3.141592
print(10 * π)
π = 3.14
print(10 * π)
アウトプット31.41592
31.4
このコードでは、1行目でπと3.141592を関連付けていますが、3行目ではπと3.14を関連付けています。
同じ変数でも、上書きされている(違うアドレスを参照している)ので、違うデータが使われたのです。
a = 1と1 = aが違う理由
ここまでの説明を整理すると、a = 1と1=aが同じにならない理由が明らかになります。
a = 1はaという変数(アドレス)と1というデータを関連付けることであり、1=aというのは、1という変数(アドレス)とaというデータを関連付けることだからです。
(パイソンでは、変数の冒頭に数字を入れてはいけないですし、aをデータとして扱うには引用符(' ')で囲む必要がありますので、1 = aというのは、Pythonの文法上は間違っていますが。)
数学で習ったa = 1は、プログラミングにおけるa = 1とは異なる。ということをしっかりと頭の中に入れておきましょう。
変数を扱う上で知っておいた方が良いこと
ここで、変数・代入・データを扱う上で知っておいた方が良いことについてお伝えしていきます。
Pythonでプログラムを書く際のルールのようなものですので、しっかりと押さえて下さい。
変数として使えるもの
Pythonにおいて変数として使えるものは以下の通りです。
aからzまでの小文字英語
AからZまでの大文字英語
英語の後に続く数字
アンダースコア
変数は大文字と小文字を区別する
Pythonでは、小文字と大文字は区別されるということも押さえておきましょう。
例えば、numberという変数とNumberという変数は別のものとして扱われます。
長い変数の場合、アンダーバーを使うことが一般的
長い変数を使う場合は、アンダーバーを使って分かりやすく説明をするようにしましょう。
temperatureという変数よりも、average_temperature_in_tokyoの方が、東京の平均気温を示しているのだな、ということが良く分かります。
長いコードを書くことは確かに手間なのですが、後で見返した時にそのコードが何を意味するのか分からず、思い出したり調べたりするほうがもっと手間です。
誰が見ても分かりやすいコードを書くことを心がけましょう。
Pythonの予約語
予約語とは、すでにPythonが特別な意味を持つものとして使われている単語のことを言います。
Pythonでの予約語は以下の通りです。
False | True | None | and | as |
assert | break | class | continue | def |
del | elif | else | except | finally |
for | from | global | if | import |
in | is | lambda | nonlocal | not |
or | pass | raise | return | try |
while | with | yield |