データを扱うときの考え方

ここで学ぶ内容
  • データ(文字や数字、ファイルなど)を操作する方法
JUVET
JUVET

ここでいうデータとは、広くは外部ファイル(画像や動画、PDFなど)も含まれますが、
簡単のため、ここでは文字や数字を指しているとお考え下さい。

これができると何が嬉しいのか
  • データの基本操作なので、画像などのファイルを操作するときに応用できる


Pythonでデータを操作するときは、そのデータに名前をつけて管理します

課題

次のプログラムを書いてみましょう。

age = 25

print(age)


前回の内容を思い出しながらこのプログラムを書いてみましょう。

セルで改行するには enter を押してください。
※プログラムの実行は shift + enter です。

何が表示されましたか?
前回の課題では文字(Hello World)が表示されたのに対して、
今回は数字の25が出力されたかと思います。

JUVET
JUVET

print(内容)で、
画面に表示したい内容が出力されることは前回解説しました。


一行目のプログラムから見ていくと、イコールをはさんで左側に英単語(age)と
右側に数字の25(数字は何でもいいです)が書かれています。
※プログラムの見やすさを考慮して、半角スペースと一緒に書かれることが多いです。

今回はこの 25 という数値データを扱います。

それで、このイコールは何をしているのかといえば、実はデータに名前をつける役割をはたしています。

JUVET
JUVET

この例では、
25というデータに age という名前が付けられたということです。


このように、Pythonでデータを扱うときには名前(今回はage)をつけなければいけません。

一行目のプログラムが行っていることはたったこれだけですが、この動作をするにあたって、用語がいくつか登場します。

まず、先ほどまで「名前」と呼んでいた age は、データの参照先(「実践」で詳しく説明します)を指していて、これを変数と呼びます。

JUVET
JUVET

データの参照先とは

「PCのどこにデータが置いてあるか」ということを意味します。

つまり、
変数とはデータの住所だと考えることができます。


またデータにつけた名前(今回は age)はそのまま変数の名前になり、これを変数名といいます。

JUVET
JUVET

住所は長くて扱いづらいので
代わり変数名を使うということです。

そして、このようにイコールを使って、データと変数をリンクさせることを代入といいます。

代入の書き方

変数名 = データ

JUVET
JUVET

プログラムで使用されるイコールは、
数学の解釈と違って、
「右辺にあるデータを左辺に入れる」と考えます。


等式として、
左辺が右辺と等しいとは考えないので注意しましょう。


Pythonでは、(文字や数字などの)データを用意すると、自動的にデータの置く場所が決まるのですが、
これは単なる数値なので私たちが見てもどこだか分かりません。

そのため、簡単に管理できるよう(データの参照先)に分かりやすい名前を付ける必要があります。

これが代入と呼ばれる操作になります。

解説

データを管理するためには、名前をつける必要があるということを説明してきました。

「何で名前をつける必要があるのか」と、疑問に思われるかもしれません。

実は文字や数字などのデータを使用するとき、
そのデータはコンピュータのメモリと呼ばれる場所に展開されます。

メモリというのは、コンピュータの一時的な記憶装置のことで、
PCの電源がついている間だけ、その情報を保持できます。

プログラミングではデータを操作しますので、そのデータの一時的な保管スペースとしてメモリを活用します。

ここで注目するのは、メモリのどこにデータが置かれるかということです。

試しに次のプログラムを実行してみて下さい。

print(id('test data'))


id( )を使うと、カッコの中のデータ(’test data’)がメモリのどこに置かれたか教えてくれます。
上記はその結果を print( ) で表示するプログラムです。


ここで出力される数字が、メモリ上のデータの場所(住所のようなもの)を指していて、
データを操作する際にコンピュータの内部で使用される識別値になります。

それでは、同じプログラムをもう一度実行してみましょう。

print(id('test data'))


今度はどのような出力が得られるでしょうか。


先ほどの出力と見比べていただくと分かる通り、同じ文字を書いても異なる識別値を示していることから、
1回目に書いたデータと2回目に書いたデータはそれぞれメモリの違う場所に展開されたということです。

実は Python では、このような(変数を使わない)書き方をすると
データは一時的にしか存在できず、プログラムを実行したあと、自動的に消えてしまいます。

つまり、先に書いた(test dataという文字)データと同じ文字データを入力したとしても
1回目のデータはすでに破棄されているため、同じ識別値が得られることはありません。

しかし、データを操作するとき、データが勝手に消えてしまっては困りますよね。

そこで毎回同じデータを参照できるように変数を使うというわけです。

JUVET
JUVET

これは Python の仕様で、
データと変数がリンクされている限り、そのデータは自動的に破棄されません。



先ほどの id( ) で出力される識別値はプログラムの内部で使用される値なので、
正直私たちには理解しづらい情報になります。

私たちは、短くて簡単な単語であれば理解できますよね。
プログラムで使用するデータにも分かりやすい名前を付けた方がいいに決まっています。

ここまでは背景知識といいますか、知っておいてほしいことですが、
変数名を決める際に守るべきルール(命名規則)がありますので、「実践」を通して慣れていきましょう。


実践

まずはデータを変数に代入するところからはじめます。
これから使用したいデータに名前を付けてあげる作業です。

次のプログラムを入力しましょう。

name = 'something'


ここでは文字データ(’something’)に name という変数名を付けたことになります。
実際に入力してみましょう。

これで文字データと変数はリンクされましたので、これ以降は変数 name を使ってデータを操作していきます。

前回お伝えした print( ) を使ってデータを表示してみます。

print(name)


今、この変数 name は文字データとリンクしているので、
print( ) を実行すると、カッコの中に書いた name の内容、
つまり、データの参照先である ‘something’ が出力されます。

JUVET
JUVET

このように変数(今回はname)を使うと、
その変数が参照する(もしくはリンクされている)
データにアクセスできるようになります。



続いて、変数名について意識してほしいことを書きます。

「変数名は一目見ただけで分かるような名前にする」

たとえば、先ほどの name という変数は英単語の「名前」を意味するので、
この変数が参照するデータの名前であることは察しが付くと思います。

ところがプログラムに書いた内容というのは一か月も経てば忘れてしまうものです。
LINEやメールと一緒だと思います。一か月前に書いた内容を思い出せるか考えてみて下さい。

もちろんプログラムを読み返せば、内容は理解できると思いますが、
変数を一目見ただけでどのようなデータを指しているか分かりづらいはずです。

たとえば、a = ‘something’ と書いた場合、
代入している行を見ればたしかにすぐに分かるかもしれません。

しかし、プログラムの途中で突然 a とだけ書いてあった場合はどうでしょうか。
この場合、その変数名を見ただけではどんなデータを指しているか、
判断が難しくなるということです。

そのため、基本的には意味のある単語を変数名にするとよいでしょう。
今後、変数を使うにあたって分かりやすい名前を付けるようにしてください。
どんなデータか一目見ただけで分かるようにしておくのが望ましいということです。

先ほどの name に話を戻します。
この変数名を見たとき、実は「何かの名前」であるところまでしか分からないので、
次のようにもう少し具体的な名前にするとプログラムが読みやすくなります。

my_name = 'Juvet'


この場合、my_name は「私の名前」を意味するので、少なくとも先ほどの name よりは簡単に
データを予想できるようになるということです。

JUVET
JUVET

Python では変数名にアンダースコア_ ←この記号)をよく使います。
というよりアンダースコア以外を使うと基本エラーになります。


なので、次のようなプログラムはエラーの原因になります。

 my name = 'Juvet'


先ほどと異なるのは、変数名に半角スペースを使用している点です。
変数名にスペースは使用できません。単語の区切りにはアンダースコアを使用しましょう。


続いて、想定されるエラーを見ていきましょう。エラーの原因を知っておくと、
自分がそのようなエラーに遭遇した時の対処方法が分かるようになります。

エラーが発生しているセルのプログラムを直してみましょう。

よくある間違い
  • 変数にデータを代入していないのに変数を使おうとする
  • 変数名にスペースを使う
  • 変数名の先頭に数字を使う

順番に見ていきます。

変数を使うときは必ずデータを代入してからです。
次のように、まだデータの代入を行っていないにもかかわらず、変数を表示しようとすると NameError が発生します。

JUVET
JUVET

プログラムは上から順に実行されるので、
この場合、値の代入が行われる前にその値を表示させようとしてエラーになるのです。

print(some_value)
some_value = 100
JsException(PythonError: Traceback (most recent call last): File "/lib/python3.10/site-packages/_pyodide/_base.py", line 429, in eval_code .run(globals, locals) File "/lib/python3.10/site-packages/_pyodide/_base.py", line 300, in run coroutine = eval(self.code, globals, locals) File "", line 2, in NameError: name 'some_value' is not defined )
print(some_value) some_value = 100


覚えておいてほしいのは、最後の赤文字の部分です。よく目にするエラー文です。

name ‘some_value’ is not defined

これは変数名の some_value が定義されていないと教えてくれています。
代入ができていないということです。

今後、このようなエラーに遭遇した場合は変数の代入がきちんと行われているか確認してみてください。

some_value = 100
print(some_value)



次は半角スペースを変数名に用いた場合のエラーです。

some value = 100
print(some value)
JsException(PythonError: Traceback (most recent call last): File "/lib/python3.10/site-packages/_pyodide/_base.py", line 421, in eval_code CodeRunner( File "/lib/python3.10/site-packages/_pyodide/_base.py", line 237, in __init__ self.ast = next(self._gen) File "/lib/python3.10/site-packages/_pyodide/_base.py", line 141, in _parse_and_compile_gen mod = compile(source, filename, mode, flags | ast.PyCF_ONLY_AST) File "", line 2 some value = 100 ^^^^^ SyntaxError: invalid syntax )
some value = 100 print(some value)


これは変数名を some value にしようとしているのは分かりますが、
このように書いてしまうと、プログラムは some と value の二つの変数を用意していると勘違いしてしまい、SyntaxError を発生させます。
文法として書き方がまずいということですね。

複数の単語を一つの変数として書く場合、アンダースコアを使いましょう。

some_value = 100
print(some_value)



最後に変数名の先頭に数字を使ってしまった場合のエラーを確認してみましょう。

1st_name = 'Juvet'
print(1st_name)
JsException(PythonError: Traceback (most recent call last): File "/lib/python3.10/site-packages/_pyodide/_base.py", line 421, in eval_code CodeRunner( File "/lib/python3.10/site-packages/_pyodide/_base.py", line 237, in __init__ self.ast = next(self._gen) File "/lib/python3.10/site-packages/_pyodide/_base.py", line 141, in _parse_and_compile_gen mod = compile(source, filename, mode, flags | ast.PyCF_ONLY_AST) File "", line 2 1st_name = 'Juvet' ^ SyntaxError: invalid decimal literal )


実際に書いてみましょう。


これも SyntaxError が発生していますね。
変数の先頭に数字を指定した場合は invalid decimal literal と出力されるので、
変数名に数字を使いたければ2文字目以降に使うようにしてください。

name_1st = 'Juvet'
print(name_1st)
JUVET
JUVET

ここまで説明しといて言うのもなんですが、
エラーが出たらググるのが一番手っ取り早いです。


変数についてはひとまず以上です。
変数は今後も当然のように使っていきますので少しづつ慣れていきましょう。

それでは、学んだ内容を定着させるために次の指示通りにプログラムを書いてみてください。

変数(変数名はtest value)に数字データ1000を代入し、画面にそのデータを表示する

test_value = 1000
  • 代入はイコール記号を使って行う
  • 変数名の単語を区切るときはアンダースコアを使う
  • print( ) で画面に表示する
test_value = 1000 print(test_value)


この例では特に重要でない値1000を使っているため、
変数名にも「単なるテストですよ」という意味を込めて test_ と付けています。
後からこのプログラムを見返したときに、
「値の確認用プログラムか」と一目で分かります。

データは変数を使って操作するのが基本です。


最後に今回登場した用語のおさらいです。

用語意味
データ文字や数字のこと(画像や動画、PDFなどの外部ファイルも含む)
変数データの参照先(メモリ内のデータが置いてある場所)
変数名変数の名前(この名前でデータの操作する)
代入データと変数をリンクさせること(変数に代入するといいます)
メモリコンピュータの一時的な記憶装置(ここにデータが置かれる)
命名規則変数に名前をつけるときのルール
アンダースコア変数名での単語の区切りに使用できる( _ ←この記号)
NameError(〇〇 is not definedの場合)変数に代入できていないという意味になります
【データを扱うときの考え方】用語一覧
JUVET
JUVET

話が長くなりましたが、
今回学んでほしかったことは、変数の代入です。


今後「変数に代入する」という文章を見かけたら、
変数 = データ
が書けるようになればそれで大丈夫です。


SNSのフォローお願いします!
ユーザーアバター

沖縄県在住

プログラミング初学者をメインにサポート中

Python C# Javascriptが得意
Blender Unityは日々勉強

AIトレンドを追っていきたい

JUVETをフォローする
フォローしてね

コメント

タイトルとURLをコピーしました