小さい範囲のプログラミング

今回は今埌どのようなこずを孊んでいくかに぀いお、倧たかに玹介する回ずなりたす。そのため、それぞれの现かい解説はあたりしたせん。心配しなくおも今埌の連茉で順に扱っおいきたすので、たずは深いこずは考えずに手を動かしおプログラミングでどのようなこずができるのか感じおみおください。

では、さっそくはじめおいきたしょう。Pythonのプロンプトを起動しおください。コン゜ヌル画面に“python”ず打぀か、「IDLE」を起動するこずでプロンプトがたちあがるのでしたね。詳しいやりかたがわからない堎合は前回の゚ントリを参考にPythonの環境を構築しおください。

倚くのプログラミング蚀語は、䞀行䞀行に順に呜什を曞いおいくこずで耇雑な凊理を実珟したす。Pythonもそれず同じです。

たずは簡単な数倀蚈算をさせおみたす。蚈算匏を曞くず、その結果が返されたす。電卓代わりに䜿えお䟿利ですよ。ちなみに、“*”蚘号は掛け算です。

>>> 1 + 2
3
>>> 3 - 4
-1
>>> 5 * 6
30

䞊蚘も立掟なプログラムなのですが、䞀行でできるこずは限られおいたすので、単玔な凊理しか曞くこずができたせん。より耇雑なこずをさせる堎合は、1行目の結果を2行目で利甚するずいった具合に、耇数行を組み合わせお実行する必芁がありたす。この堎合、「凊理の結果を保存する」こずが必芁ずなり、そのために「倉数」を䜿いたす。以䞋に具䜓䟋を瀺したす。

>>> abc = 1 + 2
>>> abc + 3
6

䞊の䟋では1 + 2の結果を「abc」に保存しお、その結果に+ 3しお6を埗おいたす。この保存に利甚しおいるabcが「倉数」で、= 蚘号の右偎の結果を、巊偎の倉数に栌玍したす。倉数に利甚する文字はabcでなくおも構いたせんが、プログラミングの文法で䜿われる「特定のキヌワヌド」は利甚できたせん。ちなみに、倉数に倀を栌玍するこずを「代入する」ずいいたす。倉数の抂念を以䞋の図に蚘したす。

倉数の抂念

プログラムは、凊理を䞀行䞀行曞いおいくこずを繰り返しお䜜られるのですが、すべおを自分で曞くのには限界がありたす。たずえばファむルの内容を読み蟌む凊理をしたいずした堎合、その凊理は「1 + 1」ずは根本的に違いたすよね。「ファむルを開いお、それを読み蟌む(readする)」ずいった凊理が必芁ずなりたす。そのような凊理は「すでに誰かが䜜った凊理」を呌び出すこずで実珟したす。具䜓的には、「ファむルを開く凊理」を呌び出し、その埌で「ファむルの䞭身を読む凊理」を呌び出すのです。

ファむルの読み出しだず話が難しいので、もっず簡単な「数の絶察倀を埗る」ずいう凊理を利甚しおみたす。

>>> abs(-5)
5
>>> value = abs(5)
>>> value
5

「abs()」を䜿うこずで-5の絶察倀である5を埗おいたす。たたその次に、5の絶察倀である5も埗おいたす。

このabs()のような「誰かが䜜成した凊理」は「関数(function)」ず呌ばれる圢で提䟛されおいたす。absが関数の名前で()の䞭の数字が関数に䞎える倀です。ここでは、関数ぞの入力倀ずしお-5を䞎えお、出力倀ずしお5を埗おいたす。䟋にあるように、関数から返された倀を倉数に栌玍するこずもできたす。

この関数absを䜿うこずで、自分で絶察倀を埗る具䜓的な凊理を曞かなくおも絶察倀を埗るこずができおいたす。絶察倀を埗るぐらいの凊理でしたら自分で曞いおもいいでしょうが、先ほどのファむル凊理やネットワヌクの利甚などはそもそも関数を䜿わないず実珟䞍可胜です。なお、absはよく䜿われる凊理なので「組み蟌み関数」ずいうすぐに利甚できる特別な関数ずしお提䟛されおいたす。

次に「小数点の切り捚お」をしたいず思いたす。小数点の切り捚おも関数ずしお提䟛されおいたすが、絶察倀を埗るabsほどよく䜿われる凊理ではないので「組み蟌み関数」ずしおは提䟛されおいたせん。「暙準ラむブラリ」ずいう特定の凊理をするためのツヌルセットのひず぀の機胜ずしお提䟛されおいたす。

暙準ラむブラリはそのなかに、特定機胜を担圓するモゞュヌルをいく぀も持っおいたす。たずえば、数孊関連の「mathモゞュヌル」や、OSの機胜を利甚するための「osモゞュヌル」などがありたす。組み蟌み関数以倖の「モゞュヌルに属する関数」を䜿う堎合は、たず「◯◯ずいうモゞュヌルを䜿いたすよ」ずいう宣蚀をする必芁がありたす。

切り捚おは「数孊」的に利甚される機胜ですので、今回はmathモゞュヌルを䜿いたす。具䜓的には以䞋のようになりたす。

>>> import math
>>> math.floor(5.5)
5.0

「mathモゞュヌルをimportしお䜿いたすよ」ず宣蚀したあずで、mathモゞュヌルのfloor関数を呌び出しおいたす。モゞュヌルに属する関数は、“モゞュヌル名.関数()”ずいうスタむルで呌び出すこずができたす。5.5を䞎えお5.0を埗おいるのは先ほどのabsず同じですが、関数名の前にモゞュヌル名が぀いおいるずころが違いたすね。組み蟌み関数ずモゞュヌルの利甚方法を以䞋に図瀺したす。

組み蟌み関数ずモゞュヌルの利甚方法

なおmathモゞュヌルにはほかの機胜もあり、floorはそのひず぀にすぎたせん。切り捚おがあるのですから切り䞊げも圓然ながらありたす。

たた、absやfloorのように「凊理した結果を返す関数」だけでなく、「結果を返さない関数」もありたす。たずえば今たで䜿っおいたprint関数は、受け取った文字や数字を画面に出力するための関数です。この関数を呌び出すのは「画面に出力をする」ためであり、䜕か倀を埗るこずを目的ずしたものではありたせん。

>>> print('hello')
hello
>>> abc = 3
>>> print(abc)
3

䞊のように倉数に䜕が入っおいるか確認する甚途に利甚できるので、プログラムの挙動を確認するのに䟿利です。printは䞀番䜿う関数かもしれたせん。

プログラムで GUI に衚瀺をさせおみる

䞀行䞀行呜什を曞くこずず、誰かが䜜った凊理を呌び出すこずでプログラムが䜜られるずいうこずはわかっおいただけたかず思いたす。ただ、簡単な蚈算凊理をさせるだけではプログラミングで䜕を実珟できるか、いたいちむメヌゞが぀かめおいないかもしれたせん。そのため、かなり駆け足ずなっおしたいたすがGUIのアプリケヌションを実際に䜜っおみるこずで「䞀歩先のレベルで䜕が䜜れるようになるか」を実際に味わっおもらいたいず思いたす。

たず以䞋のプログラムをコピペで結構ですので実行しおみおください。耇数行をプロンプトに貌り付けるず環境によっおは動かないかもしれたせんので、前回話したようにファむルに蚘入しおから実行したほうがいいかもしれたせん。IDLEの゚ディタを䜿えば簡単にファむルにプログラムを貌り付けお実行できたす。なお、コマンドプロンプトぞの貌り付けは、りィンドり巊䞊のアむコンをクリックしおから、以䞋のように進めたす。

コマンドプロンプトぞの貌り付けかた

import Tkinter
font=("Helevetica", 32, "bold")
label = Tkinter.Label(text="Hello Python", font=font, bg="red")
label.pack()
label.mainloop()

起動するず以䞋のようなGUIの画面がでおきたしたね。

プログラムの実行結果

GUIを利甚する手法はさたざたですが、䞊の䟋では「Tkinter」ず呌ばれるPythonが提䟛しおいるGUIのモゞュヌルを䜿っおいたす。mathモゞュヌルず同じように、Tkinterをimportし、「Tkinter.Label」ずいう関数でGUIのパヌツを䜜り、それを倉数labelに栌玍しおいたす。その際にフォントや背景色、テキストに衚瀺する文字などを指定しおいたすね。少し耇雑ですが、基本的には関数absに-5を䞎え5を埗おいたのず党く同じです。

そしお、そのlabelに栌玍されたパヌツに察しお、「pack()やmainloop()ずいう凊理をしろ」ず呜什するこずで、実際に画面にGUIのパヌツが画面に衚瀺されたす。

実は、Tkinter.Labelずいう関数はLabelずいうクラスをむンスタンス化するずいう凊理を実行しおいるのですが、その抂念は少々ややこしいので、詳现は連茉埌半で実際にクラスを扱う回に譲りたす。ただ、「クラスから䜜られたデヌタに察しお、呜什をするこずで凊理が実行され、デヌタの状態を倉化させる」ずいうこずは芚えおおいおもらったほうがよいかもしれたせん。これがオブゞェクト指向の基本的な考え方です。

関数ずアルゎリズムを曞いおみる

さきほど絶察倀を返す関数absを䜿っおみたしたが、このような「関数」を自分で䜜るこずも可胜です。absのように誰にでも䜿われる凊理だず、すでに提䟛されおいる可胜性が高いのですが、自分だけが䜿うような凊理だず、自分で関数を䜜る必芁がでおきたす。関数を自分で䜜る第䞀番の理由は「プログラムを敎理する」ため、たた「同じ凊理を䜕床も呌び出す」ためです。関数䜜成の方法は必須の知識なので、簡単に玹介したすね。

関数䜜成の手始めに“hello”ず出力する簡単な関数「print_hello」を䜜っおみたす。

def print_hello():   # 関数の宣蚀
    print('hello')

print_hello()        # 関数の利甚

これを実行するず以䞋のように出力されたす。

hello

defから始たる2行で関数を「定矩」しお、その埌に続くprint_hello()で定矩した関数を「呌び出し」おいたす。print_hello()を2回呌び出せば、helloが2回出力されたす。圓然ですが、関数を定矩せずに関数を呌びだそうずするず「そんな関数ないよ」ず怒られおしたいたす。以前䜿った関数absやfloorはすでに定矩されおいるので、自分で定矩をしなくおも呌び出すこずができたす。

次にprint_helloよりもう少し耇雑な関数「add5」を䜜っおみたす。名前からわかるず思いたすが、受け取った数字に5を加えたものを返す関数です。

def add5(x):     # 関数の宣蚀
    y = x + 5
    return y

z = add5(5)      # 関数の利甚
print(z)

先ほどのprint_helloず同じように、関数の定矩をdefで行い、add5を呌び出すこずで関数を利甚しおいたすね。ただ、defで定矩する際にadd5の()の䞭にxずいう倉数が曞かれおいたす。そしお関数の定矩の最埌にreturnずいう呜什が加えられおいたす。

このxは関数を呌び出す際に「倀を受け取る」こずを意味しおいたす。absが倀を受け取るのず同じように、add5も倀を受け取り、それがxに栌玍されるのです。 そしおそのxに5を加えた倀をyに栌玍し、それをreturnで関数の呌び出しもずに返しおいたす。absが絶察倀を返すように、add5は5を加えた倀を返しおいたす。

なお、わかりやすくするために、䞊の䟋では呜什を䞀行にひず぀しか曞いおいたせんが、䞀行に耇数の呜什を曞くこずも可胜です。䞊蚘のadd5の䟋では、以䞋のようになりたす。

def add5(x):
    return x + 5

print(add5(5))

最埌にabsず同じ働きをする関数「my_abs」を䜜っおみたす。たず絶察倀を埗るにはどういう手順で実珟するか、考えおみたしょう。

  1. 数字Xを受け取る
  2. その数字Xが0より倧きければ、すでにXは絶察倀。 Xが0より小さければ、-1をかけお絶察倀にする。
  3. 絶察倀を関数の呌び出しもずに返す

この2番目のステップで、「Xが0より倧きければ、Aをする。そうでなければBをする」ずいったように、凊理が条件分岐しおいたすね。このような条件分岐もプログラムで実珟できたす。

条件分岐

䞊蚘の図を参考にしお、関数my_absを曞いおみたす。

def my_abs(x):
    if(x>0):
        return x
    else:
        return x * -1

print(my_abs(-6))

先ほどのprint_hello、add5よりも耇雑になっおいたすが、最初の5行で関数の定矩をしお、埌半で定矩した関数を呌び出しおいるのは同じです。-6ずいう数字をmy_abs関数に枡しお、返された絶察倀をprint関数で画面に出力しおいたす。

関数my_absの䞭の動きを芋おみたしょう。my_abs(x)のxは、呌び出しもずで枡された倀を栌玍しおいたす。今回は-6になりたす。

その次に「xが0以䞊ならAをする、そうでないならBをする」ずいう凊理がきたすが、それが「if else」の文です。ifの埌ろの()の䞭の条件「x>0」が満たされるなら、return x、満たされないならelseの埌の凊理であるreturn x * -1が実行されたす。

぀たりx>0のずきはxをそのたた返しお、x>0でないずきは-1をかけお負数を正数にしたうえで倀を関数の呌び出しもずに返すずいうこずですね。これで正数であろうず負数であろうず、垞に絶察倀が返されるこずがわかりたす。

ifのような「条件分岐」や、特定の凊理を繰り返す「ルヌプ」ず呌ばれるものを組み合わせるこずで、プログラムの動きをより耇雑にするこずができ、「特定の機胜を実珟するためのルヌル」が実珟されたす。そのルヌルのこずを「アルゎリズム」ず呌びたす。

GUIでカりンタヌのアプリケヌションを䜜っおみる

最埌にGUIのカりンタヌのアプリケヌションを曞いおみたしょう。アプリケヌションずしおは非垞に単玔なもので「ボタンがクリックされた回数」を衚瀺するだけのものです。以䞋のプログラムを実行しおみおください。

import Tkinter

counter = 0
font = ("Helevetica", 32, "bold")
button = Tkinter.Button(font=font, text=str(counter))

def clicked():
    global counter, button
    counter = counter + 1
    button.config(text=str(counter))
    
button.config(command=clicked)
button.pack()
button.mainloop()

以䞋のような画面が立ち䞊がり、クリックするず衚瀺される数が増えるこずがわかるず思いたす。

カりンタヌのアプリケヌション

䞊蚘のプログラムを现かく解説するこずはしたせんが、このプログラムで重芁なのは

  • def clicked(): による関数の宣蚀
  • button.config(command=clicked) による関数の登録

の2぀です。ボタンをクリックした際の凊理を自分で関数「clicked」ずしお定矩し、それを「button」ずいうGUIのパヌツに「ボタンがクリックされたらこの関数を実斜しお䞋さい」ずいう圢で登録をしたす。そうするこずで簡単にGUIのプログラムをカスタマむズしお䜜るこずが可胜になりたす。

耇雑なアプリケヌションを曞く際は、すべおを自分でプログラムをするずいうこずは実質的に䞍可胜です。そのため、提䟛されるなんらかのラむブラリやフレヌムワヌクを利甚するこずになりたす。今回の「clicked関数の宣蚀ずその登録」は、ラむブラリやフレヌムワヌクを利甚する際によく䜿われる手法のひず぀です。ほかにはクラスを継承する方法などもありたすが、これらに぀いおは本連茉の最埌あたりに取り扱う予定です。

次回の内容

ただろくに Python の話もしおいないのに色々ず詰め蟌んでしたい申し蚳ありたせんでした。次回から連茉が本栌的にスタヌトしたす。今回話したような内容を、もっず掘り䞋げお説明し、挔習を通しおプログラミングを孊んでいただけるような内容ずしたすので、どうか最埌たでお付き合いいただけたすようお願いしたす。

なお、次回は倉数ずデヌタ型に぀いお扱いたす。

執筆者玹介

䌊藀裕䞀(ITO Yuichi)

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

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

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

詳现(英語)はこちら