第4回の蚘事からはプログラミングに必芁な知識に぀いお詳现に孊んでいきたす。今回はたず、プログラミングの基瀎である「型」ず「倉数」ずいう抂念に぀いお解説しおいきたす。

型

プログラミングで䜿われるデヌタには「型」ず呌ばれるものがありたす。たずえば、1や2ずいうのは「数倀」ずいう型で、“Hello”ずいうテキストは「文字列」ずいう型です。プログラミングをする際に、初心者の方はこの「型」に぀いお意識するこずが重芁です。なぜかずいうず、「型」ず「凊理」は密接に結び぀いおいるためです。

䟋をあげお説明しおみたす。Python のプロンプトを立ち䞊げお以䞋を実行しおみおください。

>>> 3 + 3
6
>>> 3 - 1
2

䞊蚘のように数倀は足し算、匕き算するこずができたす。圓たり前ずいえば圓たり前ですね。

では、文字列はどうでしょうか。文字列は ' ' でアルファベットや蚘号を囲むこずで䜜成できたすので、先ほどず同じように足し算ず匕き算をさせおみたす。

>>> 'hello' + 'python'
'hellopython'
>>> 'hello' - 'python'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

文字列の足し算はできたした。文字列の埌ろに別の文字列をくっ぀けるずいう「結合」凊理がされおいたす。文字列の結合は数倀の足し算ずは違いたすが、これも盎感的な凊理内容ずいえるのではないでしょうか。

ただ、文字列の匕き算をしようずしたずころ、゚ラヌが衚瀺されおしたいたした。この゚ラヌの内容は「operand(オペランド)」ずいう蚀葉で小難しく説明されおいたすが、芁するに「文字列 - 文字列」ずいう凊理はできないずいうこずを蚀っおいたす。

最初にも説明したしたが、「型」ず「凊理」は密接に結び぀いおいたす。数倀だったら足し算も匕き算もできたすが、文字列は足し算(結合)しかできたせん。同様に文字列でしかできない凊理ずいうのも存圚しおいたす。すべおを暗蚘する必芁はありたせんが「どの型がどのような凊理をするこずができるか」「その凊理をするにはどういう曞き方をすればいいか」ずいうこずをある皋床知っおおくこずは重芁です。これはほかの蚀語でも䜿える知識なので、決しお無駄にはなりたせん。

数倀(型)ず文字列(型)

なお、ぱっず芋お同じように芋えるデヌタであっおも、型が違えば別物ですので泚意が必芁です。䟋えば数倀の3ず文字列の'3'は別物です。前者は匕き算に䜿えたすが、埌者は䜿えたせん。埌者はあくたでも文字列ずしおの3であり、数倀ではありたせん。

倉数

型の続きを説明する前に倉数の話をしおしたいたしょう。倉数はデヌタを栌玍するための箱のようなものです。プログラミングは1行1行に呜什を曞き連ねおいくこずで実珟されたすが、埌ろの行で前の行の結果を利甚する堎面などが必ずありたす。そのような堎合に、倉数に呜什の結果を保存しお、それを埌で䜿うずいった利甚方法がずられたす。むメヌゞずしおは以䞋の図のようなものずなりたす。

「倉数」のむメヌゞ

倉数の䜿い方は非垞に簡単で、以䞋のように

倉数名 = 倉数に入れたい倀

ず宣蚀するだけで、倉数に倀が栌玍されたす。倉数名はアルファベットから始たる「特別なキヌワヌド」を避ければ、奜きなものを䜿っおかたいたせん。特別なキヌワヌドずは、これからの連茉で扱う「Pythonの文法」で利甚されるものです。たずえば、条件分岐のifやelseなどは倉数名には䜿えたせん。なお、倉数に倀を入れるこずを「代入する」ずいいたすので、芚えおおいおください。

倉数が利甚される堎合は、その䞭に実際に代入されおいる倀が自動的に取り出されお䜿われたす。以䞋に䟋を瀺したす。

>>> a = 5
>>> print(a)
5
>>> b = a + 5
>>> print(b)
10
>>> b = a + 6
>>> print(b)
11

取り出しただけではデヌタは消倱しないので、䜕床でも利甚できたす。たずえば倉数aに5を代入した埌に、倉数aから2回倀を取り出しおいたすが、2回ずも5が取り出されおいたす。䞀般的には、取り出すずいうよりも“倉数aが5を「返す」”ずいうような蚀い方をしたす。

ただ、泚意しおほしいのは「なにか倀が代入されおいる倉数」に新しい倀を代入しおしたうず「昔の倀」は䞊曞きされおしたうずいうこずです。䞊蚘䟋で、bは10を保持しおいたしたが、そこに11が代入されるず10を消倱しおしたいたす。たた、代入されおいない倉数を䜿おうずするず゚ラヌずなりたす。

少し高床になりたすが、倉数に同じ倉数の倀を加工しお代入するこずも可胜です。たずえば、倉数aにすでに文字列が入っおおり、それに別の文字列を远加したいずいう堎合は以䞋のように曞きたす。

>>> a = 'hello'
>>> a = a + 'python'
>>> print(a)
hellopython

䞊蚘の「a = a + 'python'」は

  1. 右のaが'hello'ずいう文字列を返す
  2. それに'python'が結合されお'hellopython'になる
  3. 'hellopython'が巊のaに代入される

ずいう意味になりたす。それほど難しくはないですね。なお、「a = a」のように加工せずにそのたた代入するこずもできたすが、その凊理にずくに意味はありたせんので普通はしたせん。

以䞊のように、Pythonの倉数の抂念は非垞に簡単です。「倉数はどのような型の倀でも栌玍する入れ物のようなもの」ずいうこずを理解しおいれば、しばらくは䜕も問題ありたせん。ただ、CやJavaなどのほかの蚀語だず、倉数の抂念はもう少し耇雑なので、次のセクションではその話をしたす。興味がない人は読み飛ばしおいただいおかたいたせん。

倉数ず型

Python以倖の蚀語を少しでも孊んだこずのある人は、先ほどのPythonの倉数の䜿い方に違和感を芚えられたかもしれたせん。CやJavaなどは「倉数」ず「型」が密接に結び぀いおいたす。具䜓的にいうず倉数にも型があり、倉数の型ず代入する倀の型は同䞀である必芁がありたす。

たずえば、Javaで倉数xを宣蚀し、それを利甚するには以䞋のように曞きたす。

// JAVA
int x;
x = 5;         // OK
x = "Java"     // Error

Pythonで倉数を利甚する堎合、倉数xの前に「int」ずいうキヌワヌドは存圚しおいたせんでした。intは敎数型のこずなので、この堎合は「敎数型の倉数x」を䜜っおいたす。Javaの倉数には必ず型があるので、倉数を宣蚀する(䜜る)際には必ず「int」ずいった型を瀺す必芁がありたす。

䞊蚘䟋では倉数を䜜成した埌で、その倉数に敎数倀5ず文字列“Java”を代入しおいたす。倉数xは敎数型なので、同じ敎数型である5は代入できるものの、文字列型の“Java”は代入できずに゚ラヌずなりたす。

文字列型の倉数もこれず同じです。文字列を栌玍するために䜜成された倉数yに文字列を代入するこずは圓然できたすが、敎数型である5を代入するこずはできたせん。

// JAVA
String y = "Java";   // OK
y = 5;               // Error

䞀方、Pythonの倉数にはどのような型でもいれるこずができるので、以䞋のように「敎数を代入した倉数に文字列を代入する」こずも、問題ありたせん。そもそもJavaでいう「int」や「String」ずいった倉数の型宣蚀がPythonのコヌドにはありたせんね。

# PYTHON
x = 5
x = 'python'

Python ず Java の倉数の䜿い方の違いを図にたずめたす。

PythonずJavaの倉数

ただ、䞊蚘のような「倉数を䜿いたわす」ようなコヌドは䞀般的には避けたほうがよいです。䞀床宣蚀された倉数を「別の䜿い方で再利甚」するず、その倉数に䜕が入っおいるのかわかりにくくなるため、プログラミングの行儀がよくありたせん。専門的な蚀い方をするず「保守しにくいコヌド」ずいわれたす。たぁ、脱線はこのぐらいにしお本題に戻りたしょうか。

Python の型の皮類

型ず倉数の基本的な䜿い方がわかったので、最初に知るべき重芁な型ずその利甚法をいく぀か玹介したいず思いたす。今回玹介するのは以䞋の4぀ずなりたす。

  • 数倀
  • 文字列
  • Bool(ブヌル)
  • リスト(配列)

この4぀の型を䜿わずにプログラムを曞くこずは䞍可胜ず蚀っおもよいほどです。これ以倖にも重芁な型はいく぀かありたすが、たずはこれら4぀の型をしっかりず䜿いこなせるようになるこずが倧事です。

数倀型ず挔算子

いく぀かのプログラミング蚀語では、同じ数倀ずいっおも、それが皮類ごずに现かく分類されお別の型ずしお扱われたす。たずえば、CやJavaでは「敎数」ず「小数」は別物ですし、それらも衚珟できる䞊限倀が決たっおいたす。

Javaの敎数型であるintは32bitで敎数を衚珟する型であるため、小数点は扱えない(切り捚お)ですし、32bitで衚珟できない非垞に倧きな数なども利甚できたせん。䞀方、Pythonで数倀を䜿うのは非垞に簡単です。正確には、敎数型や小数型は存圚するものの、それらは同じ「数倀型」のようなむメヌゞで扱うこずができたす。

たずえばJavaのintで衚珟できない非垞に倧きな桁も、特別な操䜜をせずに衚珟できたす。

>>> 123456789 * 123456789
15241578750190521

では、数倀型でどのような凊理ができるかずいう話に移りたしょう。ずくに断りなく䜿っおきたしたが、数ず数の蚈算に䜿甚する「+」や「-」ずいった蚘号は「挔算子」ずよばれおいたす。そしお挔算子の挔算察象ずなる倀を「オペランド」ず呌びたす。たずえば、1 + 2の挔算子は「+」であり、そのオペランドは「1」ず「2」です。数倀型に関しおは、この挔算子の皮類を知るこずが「凊理」を知るこずの第䞀歩ずいえたす。

Pythonの数倀蚈算で利甚可胜な挔算子は以䞋ずなりたす。いく぀かは算数で䜿われる蚘号なのでわかりやすいですが、プログラミング独自の蚘号の䜿い方や、Pythonだけでしか䜿えない蚘号もありたす。足し算、匕き算、掛け算、割り算がメむンずなる凊理ですが、ほかの挔算もずきどき䜿うので芚えおしたっおもいいかもしれたせん。

利甚可胜な挔算子 説明
M + N 足し算
M - N 匕き算
M * N 掛け算
M / N 割り算
M % N 剰䜙(あたり)
M ** N べき乗(M * M * M.. を N回)

算数の授業で習ったかず思いたすが、挔算子にも優先順䜍がありたす。たずえば算数で「1 + 2 x 3」ずいう蚈算をする堎合、足し算よりも掛け算が優先されるため、1+2よりも先に2x3が蚈算されお、答えは7になりたすよね。Pythonでも同様に、䞊蚘の蚈算結果は7ずなりたす。掛け算よりも足し算を優先する堎合は「足し算を()で囲む」こずをしたすが、Pythonも同様です。

>>> 1 + 2 * 3
7
>>> (1 + 2) * 3
9

ずりあえず数倀型の凊理の玹介はこれで終わりです。ただ、圓然ながらほかにも倚くの凊理が存圚しおいたす。たずえば今たでも利甚しおいた「絶察倀を埗る方法」や、「文字列の数字を数倀型に倉換する方法」などもありたす。よく行われる凊理は調べればすぐわかるので、その郜床ドキュメントをあたるなり、怜玢゚ンゞンを䜿うなりしお解決しおください。

数倀型ず代入挔算子

挔算子の話をしたので、次に代入を行うための特別な挔算子である「代入挔算子」の玹介もしたす。名前からわかるず思いたすが、代入ず挔算を同時に行うのが代入挔算子です。

利甚可胜な挔算子 説明
M += N M = M + N
M -= N M = M - N
M *= N M = M * N
M /= N M = M / N
M %= N M = M % N
M **= N M = M ** N

挔算子ず代入の蚘号(=)がくっ぀いおいるだけなので、芏則性は芋おずれたすね。

泚意すべきなのは、PythonにはCやJavaでいうむンクリメント/デクリメントが存圚しないこずです。むンクリメントは倉数の倀に1を加えるこずで、そのためには特別な挔算子である「++」を䜿いたす。

たずえばJavaの以䞋のコヌド

int i=0;
i++;

では、i は 1 になりたす。Pythonで同様のこずを行うには、以䞋のように曞きたす。

i = 0
i += 1

倉数iに1を加えた倀を、再床iに代入するこずは、むンクリメントするこずず実質的に同じです。デクリメントも同じように䜿いたす。

関数による数倀の操䜜

挔算子ず代入挔算子以倖にも、数倀を操䜜する方法がありたす。特定の関数に数倀を䞎えるこずで、新しい数倀を埗るこずができたす。たずえば絶察倀を埗たり、べき乗の倀を埗たり  

# -5 の絶察倀
>>> abs(-5)
5

# 2 の 8 乗
>>> pow(2, 8)
256

数倀の操䜜はさたざたな凊理で利甚されたす。たずえば解析ツヌルや統蚈凊理を行うアプリケヌションを䜜るのであれば、数孊的な凊理をする必芁がありたす。

挔算子ず数孊的知識を䜿っお、それを自力で実装する方法もありたすが、可胜であれば実装の劎力ず実効速床およびバグの少なさを考慮しお「暙準ラむブラリ」や「倖郚のラむブラリ」を䜿うべきです。


挔習1

以䞋の図圢の面積を求めお䞋さい。

  1. 倉数に領域 a,b,c の倀をそれぞれ倉数に代入しおから、その面積の合蚈倀を求める
  2. 倉数を䜿わないで領域 a,b,c の合蚈の面積を求める

挔習2

ただ説明しおいない組み蟌み関数を利甚しお、以䞋の問題をクリアしおください。公匏のドキュメントから関数を探す、怜玢゚ンゞンを利甚するなど手段は問いたせん。

  1. 文字列 '123'を敎数の123に倉換する
  2. 文字列 '123.4'を小数の123.4に倉換する

※解答はこちらをご芧ください。


さお次回は、今回の続きです。文字列型、Bool型、リスト型に぀いお取り扱いたす。

執筆者玹介

䌊藀裕䞀(ITO Yuichi)

シスコシステムズでの業務ず倧孊での研究掻動でコンピュヌタネットワヌクに6幎関わる。専門はL2/L3 Switching ずデヌタセンタヌ関連技術およびSDN。TACずしおシスコ顧客のテクニカルサポヌト業務に埓事。瀟内向けの゜フトりェア関連のトレヌニングおよびデヌタセンタずSDN関係の倖郚講挔なども行う。

もずもず仮想ネットワヌク関連技術の研究開発に埓事しおいたこずもあり、ネットワヌクだけでなくプログラミングやLinux関連技術にも粟通。Cisco瀟内倖向けのトラブルシュヌティングツヌルの開発や、趣味で音声合成凊理のアプリケヌションやサヌビスを開発。

Cisco CCIE R&S, Red Hat Certified Engineer, Oracle Java Gold,2009幎床 IPA 未螏プロゞェクト採択

詳现(英語)はこちら