前回に引き続き,Pythono3 の基本的な使い方を説明していきます.今回は反復処理に焦点を当てます.
プログラムを用いる利点として,人力では計算できないものを(近似的に)行ってくれる(数値計算),似たような作業を何回も自動的に繰り返してくれる(反復処理,自動化)などが考えられます.後者の利点を最大限に利用するために,反復処理を理解していきましょう.
反復文の前に:リストについて
リストを作成(定義)する
リストは,ある変数の集りのことです.集りの指示には角括弧([]のこと)を用います.例えば
lisutodayon = ['red', 'green', 'blue', 2]
のように書くと,red, green, blue という3つの文字列と,2という一つの数字を持つ要素の集まりである「lisutodayonという名前を持ったリスト」ができます.このようにいろんなタイプ(正確には型)の変数を混ぜることができますが,通常は一つの型についてのまとまりとして扱います.
リストの3番目の変数にアクセスする
lisutodayon = ['red', 'green', 'blue', 2] print( lisutodayon[2] )
このプログラムを実行すると blue が表示されます.文字列のときと同じく,最初は0番目としてカウントするのが多くのプログラム言語での鉄則です.なので,lisutodayon[0] は一番最初の’red’という文字のことであり,lisutodayon[2] は前から数えて3番目の’blue’という文字のことになります.
リストに要素を追加
既存のリストに新しく要素を加えたいときがあります.その時は「append」の機能を使います.
lisutodayon = ['red', 'green', 'blue', 2] lisutodayon.append(3) print(lisutodayon)
実行結果は [‘red’, ‘green’, ‘blue’, 2, 3]となります.要素に新しく整数型の3が追加されていますね.
lisuto.append(x)
と記述することで,「lisutoという名前がついているリストに,xという要素を追加します」という意味になります.
for文
いろんなプログラム言語にもある反復処理が for文 と呼ばれるものです.Python でそれをどのように使うのかを見てい来たいと思います.
ある数字の区間を反復
for i in range(0,10): print(i)
これを実行すると0から9までの文字が改行されながら表示されます.
ここで初めて大事になってくるのは,
- 「for」で始まる行の終わりにコロン(:)がついていること
- 「for」の次の行で,行頭に空白があること
の2点です.2番目のことを「インデント」といいます.
このプログラムの仕組みは次の通りになります.まず最初の行を見ていきましょう.「for」という文字が反復を意味します.その次にある「i」は「反復させる変数の名前を,仮にiとします」ということです.反復の際に用いる変数の名前について言っているだけなので,どのような反復をするのかはここまででは提示していません.どのような反復をするかは次の「in range(0,10)」で指定しています.range はpythonでは型の種類という扱いになるのですが,詳しい説明は抜きにして今回の例に限って言うと,「range(0,10)」は「0以上10未満の整数」という意味になっています.慣れないうちは間違えやすいのですが,以上と未満の組み合わせです.これは表示された数のことですね.つまり最終的に「for i in range(0,10):」の意味は「まず最初に,iが0としてインデントされた部分の処理をする.次にiを1としてインデントされた部分の処理をする.次に… とやっていって,最後にiを9としてインデントされた部分の処理をする.」となります.文字で書くとややこしいですが,実際0と10の部分の数字を変えて何度も動かしてみると,より簡単なものとして理解できると思います.
もう少し知りたい方のため:range()
range()について,気になる人のために少しだけ書いておきますと,python における「range」は一つの型です.扱いとしては list や set に近いです.上の例だとrangeの引数は2つでしたが,一般的には3つの引数を使います.次の例を見てみましょう.
for i in range(0,10,2): print(i)
これを実行させてみると,0,2,4,6,8 が改行されながら表示されるかと思います.さっきとの違いは引数に2をさらに加えたことです.「range(0,10,2)」の意味は「0以上10未満の数を,0から2刻みで持ってくる」という意味になります.なので,0,2,4,6,8 が表示されたわけです.そう考えると,先ほどのように最後の引数を指定しない場合は刻み幅のデフォルト値として1を持ってきていると考えれますね.
また,次のようにrange型の数をリストに変換することもできます.
a = list( range(0,10,2) ) print(a)
実行結果は[0,2,4,6,8]となります.
同じ処理をする範囲を直接指定
for i in [0,4,7,10]: print(i)
これを実行すると[]の中(0と4と7と10)が文字が表示されます.[0, 4, 7, 10] という数字のリストをinの次に書くことで,そのリストの中の数字を順番にiに代入して反復処理します.
リストの要素について反復
これは極めてpythonらしいコードの書き方で,とても便利です.for 文の in の次にリストを用いると,そのリストの中身について反復してくれます.これはpython特有のfor文の特徴なります.応用として次のようなコードを見てみましょう.
sangenshoku = ['red', 'green', 'blue'] for i in sangenshoku: print(i)
実行結果は red, green, blue を表示します.このように「for (変数) in (リスト)」と書くことで,「リストの要素を変数に順番に代入しながら,インデントした部分を反復処理をする」という指示ができます.リストの要素の方は数でも文字でもなんでもいいことがポイントです.
反復回数を記録しながら反復
リストの要素をfor文の変数に入れて反復処理させるとき,その要素がリストの何番目かも気にしながらやりたいときがあります.その方法として「enumerate」という機能を使います.
colors = ['red', 'green', 'blue'] for i,color in enumerate(colors): print(i) print(color)
実行結果は 0,red,1,green,2,blue を改行しながら表示します.「for i,color in enumerate(colors):」と書くことで「colorsの要素をcolorという変数に順番に代入しながらインデントされた部分を反復処理するが,何番目の反覆かをiという変数に入れてください」という指示になります.一番最初は0番目であることに気を付けましょう.
while 文
for 文では反復する範囲を何らかの範囲で指定する必要がありました.一方今から紹介する while 文は「ある条件が満たされる限り,反復し続けろ」という指示を出します.例を見ましょう.
i = 0 while i<5: print(i) i += 1
実行結果は 0,1,2,3,4 となります.
コロンとインデントのルールはfor文と同じですが,while と:(コロン)で挟まれた部分がfor文のときと少し違います.上の例ですと「iが5以下であれば,インデントした部分を反復して処理する:」という指示になっています.反復作業の中に「i+=1」とありますが,これは「i=i+1」に等しく,iに1を足す作業をしています.つまり反復作業の過程でiが変化していくので,いつかはiが5より大きくなるためwhile文の反復作業が中断される仕組みになります.「while文の外に出る」という言い方もします.
反復の強制終了
反復作業を途中終了させる方法に「break」という指示があります.
i = 0 while i<5: print(i) i += 1 break
これを実行すると0が一度表示されるだけで上のような反復処理が行われません.その理由は,python が行ごとに指示を処理していく段階で反復作業の中のbreakに出会うと,「その反復作業からを抜け出す」ということをします.上のコードですと.
- 1行目:iに0を代入する
- 2行目:while 文の中に入る
- 3行目:i(つまり0)を表示する
- 4行目:iに1を足す
- 5行目:while文から抜け出す
という処理が行われているため,0しか表示されないのです.
break の使い道
この while 文はそれ単体だと反復を中断させてしまうため,あまり意味がないように思えます.しかし,あとで習う「if文」というものと同時に用いることで「もしこういう条件のときは,反復文から抜け出しましょう」のような使い方ができます.これはとても便利なので,if文を説明するときに必ず書こうと思いますが,ここでは省略したいと思います.
ここまでがpythonで反復処理をする際の超基礎的な内容(だと筆者が考えている内容)になります.リストのfor文はpythonチックなので,使いこなせるようになればpython色に染まったといってもよいでしょう(いや知らんけど).前回の投稿と今回の投稿までの知識を応用することで言語処理100本ノック 2015 の00から02までは確実に解けるでしょう.
「いつになったら言語処理100本ノック 2015がスラスラ解けるようになるんだよ(怒)」
...ホントごめんなさい...次の投稿で文字列(文章)の処理について扱う予定で,それさえクリアすれば 1章(09まで)は自力で解けるような投稿を書こうと思います.というか書きます.わかりやすくを意識しすぎるあまりクドイ言い方になっているかもしれませんが,もう少し辛抱していただきたいです...
読んでいただいて本当にありがとうございます.