見出し画像

小学生でも分かる...!? Pythonプログラミング - object / identifier / variable / assignment

← preview

next →


object

>> object_oriented = オブジェクト指向

 object_oriented.


〔 object_oriented ( オブジェクト_オリエンテッド ) 〕


プログラミングを勉強していると、
必ずと言っていいほどブチ当たって理解に苦しむものがあります。

それは「オブジェクト指向」というものです。

今回は説明しませんけど。
いや、現在進行形で説明中とも言えるかもしれません。

社会を動かすプログラミングコードの多くが
この「オブジェクト指向」という
考え方概念に基づいて作られている
と言っても過言ではないです。

オブジェクト指向」は非常に理解し難い概念です。

説明文の難しさは、もはや嫌がらせレベルだ。
テクハラと言ってもいい。

そんな専門用語だらけの説明文を読んで理解するためには
多くの予備知識が必要になります。

今はあなたや僕がそれを理解できるようになる為に
準備している状態。
だから現在進行形で説明中なわけです。

最終的には「オブジェクト指向とは何ぞや」という問いに対して
小学生...いや、高校生以下でも理解できるようなレベルにまで
噛み砕いて記事を書けるような状態を目指します。

では参りましょう。
これからするのは「オブジェクト」についての話です。

※「オブジェクト指向」と大いに関係のあるワードですが、
混同しないようお頼み申し上げます。


>> object = 物体, 対象, 目的

object.

〔 object ( オブジェクト ) 〕

プログラミングの本を読んでいると、
「イミュータブルな オブジェクト 
「〇〇クラスのオブジェクト」というように
「 オブジェクト 」という言葉が頻繁に出てきます。

「 オブジェクト 」について理解する事は非常に大事です。
これから行う説明に何度も登場するワードなので
しっかり読んで理解していただきたい。

「 object 」の日本語訳は「 物体, 対象, 目的 」です。

プログラミングにおける「 オブジェクト 」は、
よく「 モノ 」と説明されます。

「自動車」「キーボード」「ペットボトル」のような
実在していて身の回りにある物が例として挙げられて、

「これらは全部オブジェクトです。」
「Pythonで言うオブジェクトも同じ考え方です。」

みたいな説明で終わってしまう事もありますが...。

...漠然としすぎですよね。よく分からない。

プログラミングと何の関係があるの?
と疑問に思っているうちに

「この文字列オブジェクトは...」
「これらのオブジェクトを一括管理して...」
「作成したインスタンスオブジェクトですから...」

みたいに説明が流れていって
あれよあれよという間に置いてけぼりを食らいます。

漠然と理解した気になっている事を無視して進んじゃいけない。
だからこそ...僕なりにではありますが、
オブジェクト」についてしっかり掘り下げてみたいと思います。


a material thing that can be touched...?


まずは、「 object 」の辞書的な意味です。

object 
= a material thing that can be seen and touched.
出典 : Oxford English Dictionary

「 視覚的に捉えられ、触れることのできる物 」の事を
「 object 」と言っているようですね。

触れることができる物の多くは、
「風」とかじゃあない限り視覚的に捉える事ができます。

でも、逆はどうでしょう?

見えても触れないものってあるんじゃないですか?
それが「 デジタル 」ってもんですよね。

今扱っているプログラミングコードってのは
デジタル世界のものですよね。
触ることはできません。

もしデジタル世界のモノに触れることが出来るのなら、
プログラミングを学ぶよりも
二次元のヨメとデートした方がいいかも知れんなあ。

現実世界のモノとデジタル世界モノは全く違うから、
プログラミングコードにおいて
どんなものが「オブジェクト」になるのか
具体的にイメージしにくいんですよ。

それが分からないから
オブジェクト」について説明を受けたり考えたりする事に
何の意味があるのかも全然分からない。


Is the pitfall an object?

「Pythonのようなオブジェクト指向言語では、
ひとかたまりのデータをオブジェクトと呼んでおり、
数値も一つのオブジェクトです。」

という説明をされれば、
オブジェクト」って何なのか
一瞬分かったような気になれます。

でも、「ひとかたまり」って何??
って思いません?

数値も一つのオブジェクトです」???
他にはどんなオブジェクトがあるの???

結局具体的なイメージができないんですよ。

後々「オブジェクト」と同等のものを指す
インスタンス」という超頻出の専門用語が登場するのですが、

オブジェクト」の正体をハッキリさせておかないと、
なぜ「インスタンス」なんて言葉を
使う必要があるのかも分からなくなってきます。

インスタンス」が分からなければ
インスタンス変数」が分からず、
クラス」も「コンストラクタ」も分からない。

だから僕は、自身の得意分野である哲学的な話を通して、
あなたに「オブジェクト」の事を更に詳しくお伝えしたいと思います。


idea

what am i ?


─ 「1」と「2」の違いとは何ですか?
言葉を使わずに説明できますか?

例えば、耳が聞こえず目も見えない状態を想像して下さい。

どうすれば「1」と「2」を区別できるでしょうか?

例えば、「 触覚 」などの
活用できる感覚を使う方法が考えられますね。

指先で皮膚を「トントン」とタップするなど、
感覚細胞を刺激することで
私たちは「2」らしきもの を体感する事ができると思います。

ただそれは、
既に『2』という概念を知っていたからこそ
『トントン』という刺激 と『2』
紐付け(関連付け)することが出来ただけ」
とも言えますよね。

もっと根本的な話をする必要があります。

私たちは一体どうやって
「1」や「2」という概念を知ったのでしょう?

これを真面目に考える人はそうそういません。
現役プログラマーでも考えるとは思えない。
だってそれよりも考えなくちゃいけない事が
たくさんあるのだから。

ですが、僕はこの思考が非常に重要だと思うのです。


experimental_rule

why crash it ?


あなたは「1」をどういう時に使いますか?
そして「2」をどういう時に使いますか?

もし、あなたの目の前に
目が見えず耳も聞こえない人がいたとしましょう。

Python生みの親であるグイド・ヴァンロッサムの名前を取って
「グイちゃん」と呼ぶことにします。

グイちゃんは「1」や「2」とは何なのかを知りません。

そんなグイちゃんの手の甲を「トン」と1回タップします。
そしてそのあと、必ず頭を撫でることにします。

そしてグイちゃんの手の甲を「トントン」と2回タップします。
そしてそのあと、必ず頭を叩くことにします。
(かわいそ...。)

グイちゃんの立場になって考えて下さい。
2回の「トントン」はグイちゃんにとって
頭を叩かれる合図になりますよね?

グイちゃんにとって「トントン」は
とても不快なものに感じられるでしょう。

逆に1回の「トン」は
快いものに感じられるかもしれません。

少なくとも「トントン」よりは
いいものだと思っているでしょう。

グイちゃんがこれ以外の経験をしなかった場合、
1」や「2」を数字だと知る事はありませんよね。


What is "1" ? 

私たちはそうではありません。
算数や数学をはじめ、日常の様々な場面で
1」や「2」を使ってきました。

グイちゃんが「快 or 不快」だけで経験してきた
1」や「2」に対して
私たちはもっと多くの経験をしてきています。

その経験よって蓄積された情報が、
1」や「2」を区別する材料になっているのです。


ではその「1」や「2」に関して蓄積された情報
試しに書いてみましょう。

【 1 】とは...
いち。「一」「壱」「 I 」「one」とも。
数字。0の次の整数。自然数の始まりの数。

🍎🍎🍎🍎🍎🍎🍎🍎... ←コレらの中の
「🍎」←コレ。コレが「1つ」。

もし、箱にテキトーに🍎を放り込んで
[ 🍎🍎🍎🍎🍎 ] ←このような状態にした事によって
その中身全てを同時に動かせそうなら、
そのまとまりを「1箱」あるいは「1セット」という。 


【 】とは...
に。「二」「弍」「Ⅱ」「two」とも。
数字。1の次の整数。1の次の自然数。
1と同じ物や事をもう一度繰り返すと、それは「2」になる。

🍎🍎🍎🍎🍎🍎🍎🍎... ←コレらの中の
「🍎」←コレが「1つ」ならば、
もう一つ用意して「🍎」「🍎」←こうする。コレが「2つ」。

[🍎🍎🍎🍎🍎]←コレを「1箱」「1セット」とするならば、それを繰り返して
[🍎🍎🍎🍎🍎]←こうする。コレが「2箱」「2セット」の状態。

しかし、「2箱」とは「箱が2つ」という意味なので
[🍎🍎🍎🍎🍎]
[🍎🍎🍎]
↑箱が2つありさえすれば、
このように中身の🍎の量が異なっていても一向に構わない。


情報の豊かさは千差万別だと思いますが、
私たちは様々な経験をして「とある物事」に対する情報(データ)を蓄えます。

その経験ないし情報(データ)を駆使して
モノを区別したり先人の作った概念を理解している....と考えられます。

「1」は「イチ」「ワン」、「2」は「ニ」「トゥー」
のように「音声紐付け(関連付け)されている」と捉える事ができますね。
これも経験の一種と言えるのではないでしょうか。


identifier

identifire.

>> identifier = 識別子(ID)

〔 identifier ( アイデンティファイアー ) 〕

さて、先ほどまでの話は、
あくまで「人間」における「1」と「2」の
違いについての話でした。

でも今私たちが相手にしているのは人間ではなく
0・1(バイナリ)」しか使えないCPUです。

自分で「経験」ができないCPUにとって
人間語の「1」や「2」を判別するというのは、
暗闇で絵柄の無いパズルをするようなものです。

CPUに「1とは」「2とは」「〇〇とは」という
人間が作った概念やその違いを「オブジェクト」として
捉えさせるにはどうしたらいいでしょうか?

結論から先に書くと、
CPUに人間語や人間の作った概念を教える事はできませんから
人間と同じような「経験に基づくデータ収集&蓄積」方法は使えません。

人には人の乳酸菌。ではないけれど、
CPUには「CPUのオブジェクト識別方法」ってものがある。

そこで使われるのが「 identifier ( 識別子 (ID) ) 」です。


>> id関数

bib number.

Pythonには、「 id関数 」と言うものがあります。
この関数は、オブジェクトに割り当てられた重複しないIDを返す関数です。

オブジェクト」をサラッと出しましたが、
解説よりまずは実際に使ってみましょう。

記述方法はシンプルで、「 id( 値 ) 」と書くだけです。 
実行すると、何桁かの数字の並びが出力されます。

PCのスペックによって桁数や番号は異なるようですが、
その桁数や番号自体に深掘りするほどの意味はないので、
「〇〇と△△のIDが同じなのか違うのか
ということだけに注目しましょう。

print( id( value) )

👆このように異なる識別子(ID)が割り当てられていますね。

識別子(ID)は「bib number(ビブナンバー)」にさも似たりです。

もしマラソン大会のビブナンバーが全員「0001」だったら、
誰が1位で誰が2位で誰が3位なのか全く区別出来ないでしょう?

牛などの動物の体に番号の書かれたタグが付いている事があります。
そのタグの番号が全て同じだったら管理する事などできません。
当たり前ですがね。

異なる識別子(ID)を割り振ってやることによって、
Pythonに「1」と「2」あるいは「1」と「"1"」を
全く違うものと識別させているのです。

print( id( value ) )

このように「オブジェクト」と呼ばれるものには、
識別子(ID)」が割り当てられています。

ほならそのIDが割り当てられている
オブジェクト」って何なのよという話ですが...

月咬は具体的にこう思っています。

変数に代入できたらそれは間違いなくオブジェクトだ!!!


variable / assignment

variable.

>> variable / assignment = 変数 / 代入

〔 variable ( ヴァリアブル ) 〕
〔 assignment ( アサインメント ) 〕

数学を勉強した時に「変数」というものが出てきたかと思います。

y = 2x」「y = x²」「y = ax+b」のように、
数値、数量が分からないものを文字に置き換えて式を立てましたね。

赤文字は全て変数。

例えば「y = 2x」は、
「『y』は『xの2倍』と等しい 」という意味の式ですよね。

x」の値が「3」だった時、
「 x = 3 」という書き方をしたと思います。

この「 文字 = 文字に当てはめる具体的な数値 
という書き方をすることを「 代入 」と言いますよね?

そして、「 具体的な数値を代入する文字 」を
「 変数 」と呼びました。

Pythonプログラミングでも「変数」を用意して、
そこに「具体的な数値など」を「代入」します。

実際にやってみましょう。

a = 123

「 = 」という記号を書くことによって、
代入する」というアクションを命令することになります。


なるほど。

それならば「y = 2x」「print( x = 3 )」と書けば
y」の値が出力されるというわけだな??

分かってきた分かってきたァ!!!!
早速やってみましょう!!👇

SyntaxError : invalid syntax

....なんで???????

あ、そうか!「2x」じゃなくて「2*x
って書かなきゃいけないんだ!!

いや〜、凡ミス凡ミスぅ〜笑
書き直してもう一回実行...っと。

再放送。

.....なんで??????????


>> define = 定義する

〔 define ( ディファイン ) 〕

なぜ構文エラーになってしまうのでしょうか。

ここで思い出してほしい事があります。
Pythonが「インタプリタ型言語」だということを。

1行翻訳 → 実行

まず、Pythonは1行目のコード「y = 2*x」だけを読んで
CPU語(機械語)であるバイナリに変換しようとします。

しかし、ここで問題が発生します。

PythonもといCPUは、「『x』とは何なのか 」
という情報を何一つ持っていないんです。

人間ならいいですよ。
「分からないものは分からない」と開き直って
変数a = 2×変数b」なんて式を立てられますけど

Pythonは分からない事があると、
そこで止まってエラーを返す仕組みになっているのです。


Pythonプログラミングでも「変数」を用意して、
そこに「具体的な数値など」を「代入」します。

という先ほどの説明を覚えていますか?

変数y に代入しようとしている
「2*x」の「x」は「変数」であって
具体的な数値などではありません!

「具体的な数値等」を代入することによって
「この変数とは何ぞや」という "定義" が完了します。

定義されていない変数は使う事ができません。

なぜ使えないのかって、もう分かりますよね。
相手が人間じゃないからです。

変数y に "未定義の変数 x" を代入してしまったから
構文エラーとなったのです。

x = 3

👆このように最初に変数に具体的な数値等を代入して
定義さえしてしまえば、ちゃんと使う事ができるので安心してください。


今回はここまでです。

まだ「オブジェクトとは具体的に何なのか
が分からないと思いますので、
次回からの記事でも引き続き説明をしていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?