Pythonの特徴として
などが挙げられますが、プログラミングをやったことのない方にはいまいちピンとこないかもしれませんね。 それでは、Google、Microsoft、Yahoo!、Youtubeなどで使用されていると聞いたら、少しは興味がわいてきませんか?
Pythonはもともと教育用に開発されたこともあって、初心者の方にも覚えやすい。
ところがどっこい、超優れた標準ライブラリ・超超優れたサードパーティーのライブラリがある。
なのでPython一つで何でも出来てしまうのだ。
それではPythonをインストールしましょう。以下ではWindows XPを想定して解説していきます。
まずはPython Japan User's Groupから「ダウンロード」、
「Python標準リリース」に進み、python-X.X.msiをダウンロードして実行し、インストールしてください。
標準では「C:\PythonXX」にインストールされるはずです。
※現在3.xが在るが、初心者にはオススメしない。
※理由は、サード(愛好者又は団体)のライブラリが殆ど対応していない。
※和訳されたドキュメントも少なく、2.xに比べると、圧倒的に英語力が必要になる。
※下記の説明には、Python2.5が用いられています。3.xでは若干の修正が必要です。
次に、Pythonをインストールしたフォルダへパスを通します。
パスの設定が完了したら、パスが通っているか確認しましょう。コマンドプロンプトを起動し、
python -V
と入力してエンターを押してください。
Python X.X
と表示されれば成功です!(これは2.5だと --versionでもいけるみたいです)
環境変数の設定が怖い方はもともとの変数値をメモ帳にでも貼り付けて保存しておきましょう。何か間違いが起きても戻せます。
それでは最初のスクリプトを記述しましょう!
メモ帳を開き、
print 'Hello World!'
と記述してhello.pyと名前を付けて保存します。場所は「C:\MyPython」にしておきましょう。コマンドプロンプトを起動し、
cd C:\MyPython
と入力してエンターを押してください。続いて、
python hello.py
と入力してエンターを押してください。
Hello World!
と出力されましたか? おめでとうございます! 初めてのプログラムは正常に動作しています!
Pythonにはちょっとしたテストや計算に便利な対話モードがあります。コマンドプロンプトを起動して、
python
とだけ入力して実行してください。対話型モードが起動し、
>>> _
というユーザの入力待ちの状態になります。
>>> 3+5
と入力してみましょう。キーを押すのは「3+5」だけです。
8
と表示されて、また
>>> _
という入力待ちの状態になりました。続いて
>>> x = 10
と入力しましょう。これは「xに10を入れる」という意味だと考えてください。 今度は何も表示されずに入力待ちになりましたね。
>>> x
と入力しましょう。
10
と表示されました。xの中身が表示されたわけです。今度は
>>> x + 10
と入力してください。
20
と表示されました。ちゃんと、xの中身と10を足した答えが返ってきます。 対話型モードは
>>> exit()
と入力するか、Ctrl+Zを入力すると終了します。
PythonにはIdleという無料のエディタがついています。 スタートメニュー → プログラム → Python 2.5 → IDLE を開いてください。コマンドプロンプトでpythonと打ったときと同じようなウィンドウが出てきます。そうです、対話型シェルです。 次にメニューボタンの「File」から「New Window」をクリックしてください。メモ帳のような真っ白なウィンドウが出てきます。そうです、メモ帳です。 実際にプログラムを行う時にはこのメモ帳モドキにガリガリ書いて、テストしたい時は対話型シェルを使います。 このメモ帳モドキにプログラムを書いてセーブしたら、メニューの「Run」から「Run Module」を選んで実行できます。 セーブする時は拡張子を「.py」とすることに注意してください。 ためしに上に書いてある簡単なプログラムをIdleでやってみましょう。
Idleがお気に召さない諸兄は統合開発環境(IDE)を使いましょう。
↑統合開発厨はすっこんでろ!
趣味PyProg(訳:趣味のPythonプログラミング)でIDEを使うような奴は一流になんて決してなれない!
シンタックスハイライトが欲しかったら「python エディタ」でググれゴミカスが!
それでは、入門サイトや書籍が読める程度の知識を身につけていきましょう。 たくさんコードが出てきますが、 特に指示のない限りは対話型モードでもスクリプトファイルの実行でも結構ですので、 実際に動かしながら覚えてください。
また、コツの一つとして、「よくわからなくてもとりあえず先に進む」というものがあります。 そのときわからなくても、あとになると「なんだ。こういうことだったのか」となるものです。 初めてなんですから、最初はよくわからなくて当然です。 あとになって必要になったらもう一回詳しく調べてみれば良いのです。 せっかくプログラミングを始めたんですから、楽しまなきゃ損です。気楽にやってみましょう!
Pythonには、もっとも手軽な出力としてprintがあります。
print 3
とだけ記入したスクリプトファイルを作成し、実行してみましょう。 コマンドプロンプトに
3
が表示されます。3の部分を'Oh, I am printed.'に変えて実行してみましょう。
Oh, I am printed.
と表示されます。続いて、対話型モードでも同様に入力して見ましょう。 同じく、3、Oh, Iam printed.と表示されましたね。
プログラミング言語には独自の文法があります。 なるべく人間にもわかりやすいようになってはいますが、それでも大規模なコードや複雑な処理をしているコードは人間には意味が通じにくいです。 そんなときにはコードにコメントを入れることで理解しやすくなります。
Pythonでは、#の後ろからその行が終わるまでがコメントになります。コメントはPythonからは完全に無視されます。例えば、
#Yes, I want to print 2, not 3. print 2 # print 3
は、
2
とだけ表示されます。#の後ろはコメントなので、無視されるからです。
以降、コード例の中でコマンドプロンプトに出力するときはたいていprintを使います。 そのとき、たとえば
print 3 + 7 #=>10
等とコメントが書いてある場合、=>の右側はprintを実行したときに画面に出力される値です。 自分で試すときは、コメントは入力しないで結構です。 以降頻繁にこの表記が出てきますので、覚えておいてください。
Pythonには基本的なデータとして、数と文字列があります。 どちらも言葉通りの意味です。 それぞれ見ていきましょう。
数には整数や少数があります。複素数もありますが、ここでは触れません。
print 3 #整数 print 3.14 #小数
足す引く掛ける割るはそれぞれ+-*/で計算できます。%は整数同士の割り算の余り、**は累乗です。
print 3 + 7 #=>10 print 12 - 8 #=>4 print 4.6 * 5 #=>23.0 print 8 / 5 #=>1 整数同士の割り算は結果も整数 print 8 % 5 #=>3 8 ÷5 = 1 余り 3 print 8.0 / 5 #=>1.6000000000000001 整数と小数だと結果は小数 print 7.5 / 2.5 #=>3.0 print 2**3 #=>8 2の3乗。2×2×2
8.0÷5は1.6のはずなのになんだか半端な数字になっていますが、Pythonの小数の実装によるものです。
文字列はその名の通り文字の連なりです。 文字をシングルクオート(')かダブルクオート(")で囲むと文字列になります。
print 'Single Quote String' #=>Single Quote String print "Double Quote String" #=>Double Quote String
です。文字列の中にシングルクオートを含めたい場合、ダブルクオートで囲みましょう。逆も同様です。
print "I'm here!" #=>I'm here! print '"Moe" is a deep thought...' #=>"Moe" is a deep thought...
文字列にはほかに生の文字列や3重クオートの文字列がありますが、ここでは触れません。
特殊な文字としてエスケープシーケンスというものがあります。 エスケープシーケンスは「\」に続く記号または英字で表現され、 主に画面に表示できない改行やタブなどを文字列に埋め込むために使います。 例えば、改行は「\n」、タブは「\t」で表します。
print 'Hello!\nHello!\nHello!'
で、
Hello! Hello! Hello!
と表示されます。他にもいろいろなエスケープシーケンスがあります。
文字列も足し算、掛け算ができます。 足し算は文字列の連結、掛け算は文字列の繰り返しになります。
print 'Hello ' + 'World!' #=>Hello World! print 'Ooops!' * 3 #=>Ooops!Ooops!Ooops!
日本語もおそらく使用できるはずです。対話型モードの場合はそのまま
print 'こんにちは世界!' #=>こんにちは世界!
です。スクリプトファイルで日本語を使用したい場合、utf-8を用いるのが楽です。 ファイルの先頭に
# -*- coding: utf-8 -*-
とコメントを書いておくと、Pythonはファイルがutf-8で書かれているものとして処理してくれます。 もちろん、ファイルをutf-8形式で保存しておく必要があります。 さらに、日本語の文字列を使用するときは文字列の先頭にuをつけます。 これは「この文字列はユニコードだよ」とPythonに指示するためのものです。 このような文字列をユニコード文字列と呼びます。
# -*- coding: utf-8 -*- print u'こんにちは世界!' print 'こんにちは世界!'
と記述したファイルをutf-8形式で保存し、実行してみましょう。
こんにちは世界! 縺薙s縺ォ縺。縺ッ荳也阜・
と表示されるはずです。uを忘れると不思議な文字列が出力されます。 スクリプトファイルで日本語を使いたい場合、先頭のコメントとユニコード文字列を忘れないでください。
いままではデータをほぼそのまま表示しているだけでした。 しかし、計算した値をとっておいたり、ユーザからの入力を受け取ったりすることを考えると、何かデータを入れておくものが欲しくなります。 この、なんらかの値を入れておくためのいれもののことを変数と呼びます。 変数は名前をつけて、何かを入れることで勝手に作成されます。 変数に何かを入れることを代入と呼びます。代入の記号は「=」です。
x = 10 print x #=>10
確かにxに10が入っています。「=」はあくまで「右のものを左のものに入れる」のであって、等号ではないことに注意してください。 なので、
x = x + 10 print x #=>20
といった記述も可能です。数だけでなく、文字列を入れることも出来ます。
x = 'Oh, I am in variable x.' print x #=>Oh, I am in variable x. print x + ' Yeah!' #=>Oh, I am in variable x. Yeah!
変数には大抵のものが入れられます。もちろん、新しい変数をつくることだってできます。
width = 10 height = 30 area = width * height print area #=>300
では、まだ作っていない変数を出力しようとするとどうなるでしょうか。
print madanai
実行すると、以下のようなエラーが出ます。
NameError: name 'madanai' is not defined
そもそもまだ作られていない変数の中身を表示させようとしても、Pythonは困ってしまうわけです。
madanai = 'Variable "madanai" already exits.' print madanai #=>Variable "madanai" already exits.
今度は表示できました。
たくさんのデータをまとめて管理したい場合、変数だけでは難しいです。 例えば、あなたが先生で100人分の生徒の成績を管理するソフトウェアを作成したいとしましょう。 そのとき、100人分の成績を格納するために100個の変数を用意するというのはさすがに難しいでしょう。 たくさんのデータをまとめて格納したいときのために、Pythonには予めいくつかのデータ構造が用意されています。 ここではリストと辞書というふたつのデータ構造を簡単に使ってみましょう。
リストはもっとも基本的なデータ構造です。 たくさんのデータが並んでいるような構造をしています。 カンマ(,)区切りのデータを角括弧([])で囲むことでリストを表現できます。
x = [10, 5, 8, 6] print x #=>[10, 5, 8, 6]
リストに入っているデータ一つ一つを要素といいます。 インデックスを使うことで、各要素を利用できます。 インデックスとは、「何番目の要素か」をあらわす整数です。例を示します。
print x[0] #=>10 xの0番目の要素は10 print x[3] #=>6 xの3番目の要素は6 x[2] = 7 xの2番目の要素を7に書き換える print x[2] #=>7 print x #=>[10, 5, 7, 6]
インデックスは0番目から始まることに注意してください。 xには4つの要素がありますので、有効な正のインデックスは0から3になります。 「正の」と言いましたが、負の数も使えます。
print x[-1] #=>6 print x[-4] #=>10
リストは変数同様、数だけでなく文字列やその他のものも入れられます。 また、いろいろな要素を混ぜることもできます。
x = ['dog', 'cat', 'cow', 'pig', 'bird'] y = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] #リストの要素としてリストを持てます z = ['pen', ['book', 5], 3.2] #いろいろな要素を持てます
インデックスを使って表示したり代入したりしてみましょう。
print y[1] #=>[4, 5, 6] print y[0][1] #=>2 yの0番目である[1, 2, 3]の1番目 print z[1] #=>['book', 7.1] z[1] = 'bird' print z[1] #=>bird
リストが持つ要素の数(リストの長さ)はlenで得られます。 lenはlengthの略です。
x = [0, 1, 2, 3] print len(x) #=>4
インデックスが0から始まることから、あらゆるリストにおいて有効な正のインデックスは0からlen(リスト)−1となります。 では、有効でないインデックスを指定するとどうなるのでしょうか。
print x[10]
以下のようなエラーがでます。
IndexError: list index out of range
インデックスが範囲外だと怒られてしまいました。注意しましょう。
空のリストを作成することもできます。
x = [] print x #=>[] print len(x) #=>0
空なので長さは0になります。 空のリストなんて何の役に立つの?と思うかもしれませんが、次節の便利な機能と組み合わせることで色々な処理ができるようになります。
さて、今まではリスト内の要素を直接記述していました。 それでは変数をいくつも用意するのと、「記述の大変さ」と言う意味ではあまりかわりません。 リストには追加や削除のための機能が用意されています。 この節で学ぶ機能と、次項で学ぶ処理の流れを変える手段を組み合わせることで、 冒頭で述べた「たくさんのデータを処理する」という目的を達成できます。
まず、追加や削除の機能を見ていきましょう。まずはリストを用意します。
x = [1, 2, 3]
リストのappendメソッドを用いることでリストに要素を追加できます。 突然「リストのappendメソッド」などと言われても意味がわからないと思いますが、 意味はおいておいて、やり方だけに注目してください。
x.append(4) print x $=>[1, 2, 3, 4] x.append('cat') print x $=>[1, 2, 3, 4, 'cat']
このように、「リスト.append(追加したいデータ)」でデータを追加できます。 途中に追加したい場合はリストのinsertメソッドを利用します。 「リスト.insert(インデックス, 追加したいデータ)」でインデックスの位置にデータを挿入します。
x = [0, 1, 2, 3] x.insert(2, 1.5) #2番目に1.5を挿入 print x #=>[0, 1, 1.5, 2, 3]
2番目が1.5になり、今まで2番目だった2が3番目に、同様に以降の要素も一つずつ後ろにずれていますね。 削除する機能もあります。「del 要素」でその要素を削除できます。delはdeleteの略です。
del x[2] print x #=>[0, 1, 2, 3]
xの2番目の要素にdelを適用した結果、先ほど挿入した1.5の要素が削除されました。
リストの非常に便利な機能としてスライスがあります。 インデックスの代わりに範囲を指定することで、リストの一部を抜き出すことが出来ます。 この機能をスライスと呼びます。 例を挙げましょう。
x = [0, 1, 2, 3, 4] print x[1:4] #=>[1, 2, 3] 1番目から3番目まで print x[0:len(x)] #=>[0, 1, 2, 3, 4] 0番目からlen(x)-1番目まで、つまりもとのリスト print x[3:3] #=>[] 終わりが初めより前の場合は空のリスト print x #=>[0, 1, 2, 3, 4]
このように、「リスト[始めのインデックス, 終わりのインデックス]」で始めのインデックスから終わりのインデックスの一つ前までを抜き出します。 リストのスライス特有の動作として、スライスへのリストの代入があります。 単純に、スライスした部分が代入したリストで置き換わります。 言葉では伝わりにくいかもしれません。例を見てみましょう。
x[1:4] = [10, 20, 30] #[1, 2, 3]を[10, 20, 30]で置き換える print x #=>[0, 10, 20, 30, 4] x[4:4] = [1, 2, 3] #4番目の位置に[1, 2, 3]を挿入する print x #=>[0, 10, 20, 30, 1, 2, 3, 4] del x[1:4] #=>[10, 20, 30]を削除 print x #=>[0, 1, 2, 3, 4]
初めのうちはわかりにくいかもしれませんが、なれてくると非常に便利です。
辞書はキーと値の組を格納するためのデータ構造です。 例えば国語辞典には、単語とそれに対する説明がたくさんあります。 この場合、単語がキー、説明が値となります。 辞書はコロン(:)で組にしたキーと値のペアをカンマで区切り、中括弧({})で囲むことで記述できます。
x = {'cat': 'nya-', 'dog': 'wan'}
作成した辞書はキーを指定すると値を返します。
print x['dog'] #=>wan
リストの場合有効な範囲外のインデックスを指定するとエラーがでました。 辞書では、代入に限っては存在しないキーを指定しても大丈夫です。
x['one'] = 1 print x['one'] #=>1
ですが、存在しないキーの値をいきなり取り出そうとすると怒られます。
print x['two']
を実行すると、
KeyError : 'two'
と表示されます。
キーが存在するかどうか判定するのはdictクラスのメソッドのhas_key(key)を使用します。
>>> ham = {'hoge': 'piyo'} >>> print ham.has_key('foo') # => False
また、以下のようにgetメソッドを使用すると、そのキーが存在する場合は対応する値を、存在しなければ指定された値を返す、というようなことが出来ます。
>>> ham = {'hoge': 'piyo', 'foo': 'bar'} >>> print ham.get('foo', None) # => bar >>> print ham.get('baz', None) # => None
これまで見てきたように、辞書のキーにはたいていの場合文字列が使われますが、数字(や、このチュートリアルでは触れていませんがタプルというデータ構造)も使用できます。しかし、リストなどイミュータブル(変更可能)なものは使用できません。
値は変数に入れられるものならなんでも結構です。つまり、ほとんどなんでも入れられます。
空の辞書も作成できます。lenで長さを計ることもできます。
print x #=>{'one': 1, 'cat': 'nya-', 'dog': 'wan'} print len(x) #=>3 x = {} print len(x) #=>0
本項では二つのデータ構造を学びました。 とりあえず、データ構造を使えばデータをまとめて管理できることはわかったでしょうか。 次項からは、これまでに学んだ変数やデータ構造をどう処理していくかを学んでいきます。
これまでの例ではコードはただ順番に実行されるのみでした。 前項の冒頭の「自分が先生だったら」の例を思い出してください。 あなたは100人の生徒の成績管理ソフトウェアを作成したいのでしたね。 このとき、生徒の成績の平均を求めたいとしましょう。 100人のデータは配列scoresに入っています。
total = scores[0] + scores[1] + scores[2] + ... + scores[99] average = total / len(scores)
こんなふうにやっても求められることは求められますが、いくらなんでも100回足し合わせるのは面倒です。 また、60点以上なら合格、80点以上なら優秀などというように、点数ごとにグループ分けしたいとしましょう。 これを実現することは、今まで学んだ知識だけでは難しそうです。
本項では、上記のような処理を実現する、分岐と繰り返しについて学びます。 あわせて、条件についても簡単に学びます。 これらの機能をおぼえるとぐっとプログラムらしくなってきます。頑張りましょう!
for文は前項で学んだリストや辞書などの中身に順にアクセスするための構文です。
for 要素を入れる変数 in データ構造: 処理
という風に記述します。処理の前にインデント(字下げ)があることに注意してください。 例えば、リストの各要素の合計を計算したい場合は以下のようになります。
xs = [0, 1, 2, 3, 4] total = 0 for x in xs: total = total + x print total #=>10
対話型シェルで実行する場合、
>>> for x in xs: ... total = total + x ... >>> print total
という具合に、改行のみの行でfor文の終わりを指示します。
total = 0 for x in xs: total = total + x print total
と記述すると、print文がfor文の処理に含まれるため
0 1 3 6 10
と繰り返しごとの結果が表示されます。 このように、Pythonではインデントが非常に重要です。
辞書についても同様にfor文で順にアクセスできます(ただし、どういった順序かは決まっていません)。 ただし、辞書の場合はキーに順次アクセスします。
pets = {"dog" : 5, "cat" : 2, "pig" : 4} for pet_type in pets: print "There are", pets[pet_type], pet_type + "s"
で、
There are 4 pigs There are 5 dogs There are 2 cats
と表示されます。pet_typeに入るのは各キーとなります。 また、辞書のkeysメソッドを使うことでキーに、valuesメソッドを使うことで値に、itemsメソッドを使うことでキーと値のペアに順次アクセスできます。
for pet_type in pets.keys(): print pet_type for pet_count in pets.values(): print pet_count for pet_type, pet_count in pets.items(): print pet_type, pet_count
を実行してみましょう。一番下のfor文で、要素を入れる変数がキーと値の二つあることに注意してください。 itemsメソッドはキーと値のペアを順に返すため、受け取る変数も二つ必要なのです。
pig dog cat 4 5 2 pig 4 dog 5 cat 2
と表示されます。 値だけが欲しいときはvaluesメソッド、値とペアのセットが欲しいときはitemsメソッドを使うことが出来ます。
if文は「もし〜だったら○○する」といった、条件による分岐を実現する構文です。
if 条件: 処理
という風に記述します。 字下げは、タブでもスペースでもかまいません。さらに、if文に続けて、「そうでなければ××する」 といった処理をを実現するelse文、「そうでなければ、〜だったら△△する」という処理をを実現するelif(else ifの略)文があります。 例を挙げましょう。
x = 7 if x < 5: print 'x < 5' elif x < 10: print '5 <= x < 10' else: print '10 <= x'
で、
5 <= x < 10
と表示されます。xに代入する数字をいろいろ変えてみましょう。
「<」は数学の記号と同じです。 他に、「>」「<=」「>=」「==」なども使えます。 「<=」は≦のことです。 「==」は等しいかどうかの比較を表します。 条件部分の式については次節でもう少し詳しく説明します。
ちょっとした応用として、与えられた年がうるう年かどうがを求めるプログラムを書いてみましょう。 ある年が4で割れればその年はうるう年だというのは知っていますよね? うるう年の計算はもう少し複雑で、100でも割れればうるう年でないのです。 さらに、100で割れる年でも400で割れる年はうるう年です。 この条件をプログラムにして見ましょう。
year = 1984 if year % 400 == 0: print year, 'is leap year.' elif year % 100 == 0: print year, 'is not leap year.' elif year % 4 == 0: print year, 'is leap year.' else: print year, 'is not leap year.'
判定の順番とelif文の使い方がポイントです。 yearに代入する数字をいろいろ変えてみましょう。 このうるう年を判定するプログラムは次節でもう少し簡単な形に書き直します。
続いて、for文と組み合わせてみましょう。
xs = [4, 5, 7, 8, 3, 2, 6, 1, 9, 0] ys = [] for x in xs: if x < 5: ys.append(x) print ys #=>[4, 3, 2, 1, 0]
数値の入ったリストxsの要素のうち、5未満のものをysに加えました。
ここで、条件部分に書く式について簡単に説明しておきましょう。 式はなんらかの値を返します。 例えば「3 + 5」という式は3と5を足した値である8が返ってきます。 では、「==」や「<=」を使った条件式は、いったいなにを返すのでしょうか。 実は、条件式は式が成り立つ場合はTrue、成り立たない場合はFalseを返します。
x = 10 != 5 #xに10 != 5の返す値を代入 print x #=>True。10は5ではありません!
「!=」は「==」の逆で、異なるかどうかを判定します。 10はもちろん5ではありませんので、xにはTrueが代入されるのです。
さて、続いて複雑な条件の書き方について説明しましょう。 andやor、notを使うことで、複数の条件式を組み合わせてより複雑な式を作ることが出来ます。 andは左右の式がどちらもTrueのときにTrue、orは左右の式のどちらか一方でもTrueならTrue、notはTrueならFalseに、FalseならTrueになります。 言葉だけではわかりにくいので例を示しましょう。
x = 20 10 <= x and x < 20 #=>False xは10以上20未満? x = 15 10 <= x and x < 20 #=>True x < 5 or 10 <= x #=>True xは5未満または10以上? x = 8 x < 5 or 10 <= x #=>False not (x < 5 or 10 <= x) #=>True xは5以上10未満?
最後の式では、orの計算を先に行うためにかっこで囲んであります。
if文の節で挙げたうるう年を求めるプログラムは、条件をうまく組み合わせることで簡単に書けます。 結局、うるう年は「4で割り切れてかつ100で割り切れない年、または400で割り切れる年」なので、
year = 1984 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: print year, 'is leap year.' else: print year, 'is not leap year.'
と表せます。
条件についてざっと学びました。かなり急ぎ足だったので分かりづらかったかもしれませんね。 はじめのうちは複雑な条件を書いたり読んだりするのは難しいかもしれませんが、プログラミングを続けるうちにだんだん慣れていくものです。 気にせず先に進みましょう。
for文はデータ構造の中身に順番にアクセスするための構文でした。 それに対してwhile文は与えられた条件が成り立っている間繰り返すための構文です。
while 条件: 処理
という風に記述します。 条件が成立すれば処理をしたあとまた条件のチェックに戻ります。 成立しなければ処理をせずにwhile文を終了します。 例として、1から5までの合計を求めるプログラムを書いてみましょう。
i = 1 sum = 0 while i <= 5: #iが5以下のあいだ sum = sum + i i = i + 1 #iを1増やす print sum #=>15 print i #=>6
処理の最後にiの値を1増やしているのがポイントです。 これが無いと、iは0のままなのでi <= 5が永遠に成り立ち、いわゆる無限ループになってしまいます。 もし無限ループを実行してしまったとしても、'Ctrlを押しながらCを押す'と強制的に処理を終了できます。 覚えておきましょう。
while文やfor文で繰り返しているとき、途中で繰り返しを抜けたり、ある特定の条件のときのみ処理を飛ばしたりしたいことがあります。 途中で繰り返しを抜けるための文としてbreak文、処理をとばすための文としてcontinue文があります。 やはり言葉だけではわかりにくいと思いますので、動作を確認してみましょう。 まずはbreak文からです。
xs = [0, 1, 2, 3, 4] for x in xs: if x == 2: break print x
実行すると、
0 1
とだけ表示されます。xが2のとき、if文のx==2が成り立ちbreak文が実行されます。するとその時点で強制的にfor文を抜けるため、2、3、4は表示されません。 続いてcontinue文の動きを見てみましょう。
xs = [0, 1, 2, 3, 4] for x in xs: if x == 2: continue print x
先ほどの例のbreak文をcontinue文に変えただけです。実行すると、
0 1 3 4
と表示されます。xが2のとき、先ほどと同様にif文のx==2が成り立ちcontinue文が実行されます。 すると、現在の周回における以降の処理(この例では「print x」)が飛ばされて次の周回に行きます。 そのため、2だけが飛ばされて表示されたのです。
では、実際どのような場面で必要になるのでしょうか。 例えば、リストの中に、ある値xと等しい要素が含まれているか調べたいとします。 単純な方法として、リストの最初の要素から順にxと一致するか調べていくというものがあります。 プログラム例を見てみましょう。
x = 5 ys = [1, 8, 5, 2, 9] for y in ys: if x == y: print 'ys includes x.' #ysはxを含む break
先ほどのbreak文の動作例とほとんど同じですね。xとyが等しかったらysがxを含むことを出力し、break文によって繰り返しから抜けます。 途中で抜け出さないと何がまずいのでしょうか。先ほどの例で、仮にysの要素が10000個あったとしましょう。 そして、4番目に5があるとします。 すると、5が見つかった段階でbreakで抜け出さないと残りの9995回の繰り返しがまるまる無駄な時間になります。 もちろんysにxが含まれていない場合は最後まで調べることになります。とはいえ、リストの要素数がN個だったとして、「うまくいけばN回よりも少ない繰り返しで終了する可能性のあるプログラム」と「常にN回繰り返すプログラム」、 やはり前者の方を使いたいと思いませんか? プログラミングに慣れてくるとこういった効率に対する考え方が自然に身についていきます。
本項ではプログラムの流れを変えるための文をいくつか学びました。 「リストの要素を全て足し合わせる」「リストの中から与えられた値と一致する要素を見つける」など、実用的、現実的なプログラムに近づいてきました。 次項では、これまで学んだ様々な要素をまとめ、より使いやすい形にする方法を学びます。
前項までに変数、データ構造、分岐と繰り返しを学び、だいぶプログラムらしいプログラムが書けるようになってきました。 しかし、例えば数値を格納したリストの各要素の合計を求めるとして、毎回
total = 0 for x in xs: total = total + x
などと書くのは面倒です。この例だと3行程度なのでそう大変でもないかもしれませんが、10行、20行といった行数の処理を必要になるごとに毎回書くのは非常に面倒ですし、馬鹿らしいですね。
また、ある程度大きなプログラムを書くことを考えます。このような場合、一度に全てを作ろうとすると大変なので、必要な処理を分解して、小さな処理を組み合わせて作成します。
このように、プログラムを書いていると処理をまとめておきたいことがよくあります。本項では、よく必要になる処理をまとめて管理したり実行したりするための方法を学びます。
Pythonにおける処理をまとめるためのもっとも基本的な手段が関数です。関数とは、何らかの処理をまとめて名前をつけ、手続きとしたものです。 例えば、「お茶を入れる」という手続きは、「お湯を沸かす」「急須に茶葉を入れる」「急須にお湯を注ぐ」などの処理をまとめたものと言えます。 また、「お湯を沸かす」という処理も「やかんに水を入れる」「やかんを火にかける」という処理をまとめた手続きと言えます。
なんとなく概念は理解できたでしょうか。わからなくても、例をいくつか見ていくうちにわかってくると思いますので、実際に関数をいくつか作ってみましょう。
まずは本項の冒頭で挙げたリストの合計を求める処理を関数にしてみましょう。
def sum(xs): total = 0 for x in xs: total = total + x return total sum([1,2,3,4,5]) #=>15 sum([6,7,8,9,10]) #=>40 sum([1,3,5,7,9]) + sum([2,4,6,8,10]) #=>55
def から return total までがなんという名前の関数でどういう処理をするかという関数の定義で、そのあと作成した関数sumを実際に使用しています。
初めての関数を書いてみたところで、少し形式ばった説明をしておきましょう。 意味はわからなくてもかまいませんので、ざっと読んでおいてください。 関数は
def 関数名(仮引数): 処理
で定義し、
関数名(実引数)
で使用します。defはdefineの略で、定義するという意味です。 仮引数というのは、関数に渡されるデータを格納する変数です。 上記の関数sumでは仮引数としてxsを指定しています。 仮引数はカンマ(,)で区切っていくつでも指定することができますし、ひとつも指定しないこともできます。 実引数は関数を使用するときに実際に渡されるデータです。 上記の例では[1,2,3,4,5]や[6,7,8,9,10]を実引数として関数sumを実行しています。 return文は実行されると関数を抜け出します。 関数におけるbreak文のようなものです。 return文のあとに指定した値は関数の返す値となります。 こうすることで、関数内で行った計算や処理の結果を関数を実行した側で利用できるようになります。 関数sumは定義の最後の行でreturn totalによりxsの合計の入ったtotalを返しています。 returnのあとに何も指定しない場合やreturn文のない関数は「値がない」ことを示す値、Noneを返します。
次はリストに値が含まれているか調べる関数containsを作成してみましょう。
def contains(xs, n): for x in xs: if x == n: return True return False xs = [3,0,6,10,7] contains(xs, 6) #=>True contains(xs, 8) #=>False
さて、関数containsの仮引数にxsが指定されており、それとは別に、リストを入れた変数xsがあります。 この二つのxsは全く別のものです。 仮引数も含め、関数定義の中でのみ使用される変数はローカル変数と呼ばれます。 ローカル変数はその名の通り関数の定義の中などローカル(局所)でのみ有効な変数で、有効範囲の外側からは使用できません。 例を見てみましょう。
def local_variable_test(): x = 10 print x local_variable_test() #=>10 print x #=>NameError: name 'x' is not defined x = 100 local_variable_test() #=>10 print x #=>100
上記の例より、ローカル変数は同じ名前の変数が有効範囲の外側にあっても、影響を受けないし与えないことがわかります。
ちょっとした装飾を施した文字列を出力するプログラムの練習として、引数として数を受け取り、その数ぶんの段がある三角形を出力する関数pyramidを書いてみましょう。
def pyramid(n): i = 0 while i < n: pad = ' ' * (n - i - 1) block = '*' * (2 * n + 1) print pad + block i = i + 1
pyramid(5)
何をしているかわかりますか。文字列同士の足し算は文字列の連結、文字列と数字の掛け算は文字列の繰り返しになることを思い出してください。 それらを利用して、左側に詰める空白やピラミッドのブロックの個数を計算し、一段ずつ表示しています。 pyramid(5)で
* *** ***** ******* *********
と表示されます。
ここまで、ざっと関数について説明しました。 関数には他にもいろいろ機能があるのですが、それは必要になったらそのつど説明することにします。 また、今詳しく知りたい方は参考文献にあるWebサイトを見てみると良いでしょう。
後で書く