ここではプログラミングでおなじみの、以下の構文について勉強します。
- if文:条件分岐
- for文:任意のシーケンス型(リスト型、文字列など)を使った反復処理(ループ)
- range関数:数列を生成
- その他:break文、continue文、ループ処理におけるelse節、pass文
4.1. if文
定義した条件に従って処理をするのがif文。いわゆる条件分岐。
以下の通り表現します。
if <条件式1>: <処理1> elif <条件2>: <処理2> else: <処理3>
条件を複数付けたい場合は、elifで新たに条件を定義します。
elseは、すべての条件に当てはまらなかった場合に実行されます。
Pythonという言語の特徴の一つとして、意味のあるブロック(例えば、上記の1~2行目)はインデント(段落)で示します。
コーディング規約(PEP8)によると、1レベルインデントするごとには、スペース4つ使うことを推奨しています。
if文の例として、、、、
- 入力した整数に対して、条件ごとにコメントを返す。
- 0未満であれば、「Negative changed to zero」と返す。
- “0”であれば、「Zero」と返す。
- “1”であれば、「Single」と返す。
- “2より大きい”場合、「More」と返す。
ように、
■ソースコード
x = int(input("Please enter an integer: ")) if x < 0: x = 0 print('Negative changed to zero') elif x == 0: print('Zero') elif x == 1: print('Single') else: print('More')
input関数でユーザからの入力を促します。ただし、入力値は文字列型(str)で認識されるため、int関数を使って整数の数値型(int)に変換する必要があります。
■出力
Please enter an integer: 42 More
4.2. for文
リスト型や文字列などをシーケンス型と呼ぶのですが、for文を使うことで要素を1つずつ取り出して、反復処理を行います。
for文は、以下のような表現をします。
for <変数> in <シーケンス型>: <処理>
<シーケンス型>から、要素1を取り出し<処理>実行。要素2を取り出し<処理>実行、・・・
for文の例として、
- 文字列を要素として持つリスト型に対しfor文でループ処理を行う。
- 各要素に対し、文字列と文字長を返す。
■ソースコード
words = ['cat', 'window', 'defenestrate'] for w in words: print(w, len(w))
■出力
cat 3 window 6 defenestrate 12
Pythonチュートリアルでは、この後「コレクションオブジェクトの値を・・・」と続きますが、ちょっとややこしい話になるので、ここでは割愛。(というか、まだ上手に説明できません。。。)
4.3. range()関数
リスト型を使えば、任意の数列を作ることができます。
例えば、ある規則に従って、かつ長い数列を作る場合、自分で作るのはめんどくさい。
そこで便利なのが、range()関数。
書き方、使い方はこんな感じです。
range(start, end, step) for i in range(0, 10, 3) print(i)
0 3 6 9
for文と組み合わせて数列を作ったりするので、リスト型と勘違いされそうですが、正しくはrange型です。
上記(range(0, 10, 3))を例にすると、”0, 3, 6, 9のリスト”と解釈するのではなく、“0~10までの値を3飛ばした数列”と解釈すると感覚的に近くなるかと思います。
数列が短いのでピンと来ないかもしれませんが、数列が長くなるとイメージが湧くかもしれません。
“0, 2, 4,…, 10000のリスト”ではなく、”0~10000まで2飛ばしの数列”と表現したほうが、同じ結果が得られますが、情報量を節約することができます。
例として、range()とlen()使って、
- 文字列を要素とした、リストを作る
- len()を使って、リストの要素数をカウントする
- range()を使って、リストの要素数に従って数列を作る(=リストのindexが並んだ数列)
- for文を使って、3の数列からindex毎に、”index 要素(文字列)”を返す。
■ソースコード
a = ['Mary', 'had', 'a', 'little', 'lamb'] for i in range(len(a)): print(i, a[i])
■出力
0 Mary 1 had 2 a 3 little 4 lamb
このような処理をするのであれば、すでにenumerate()関数が存在します。
range()とlen()を、enumerate()に置き換えてると以下の通りです。
■置き換えたソースコード
for i, arg in enumerate(a): print(i, arg)
enumerate()関数はfor文を使うと、indexと要素を返します。
上記のポイントとしては、indexと要素の2つを返すので、それを受ける変数も2つ(iとarg)用意する必要があります。
また、range()関数のように、for文を使って各要素を取り出すことのできるもの(イテレータ)を、イテラブルオブジェクトといます。
range()関数以外にも、文字列やリスト、タプルなどもイテレータに該当します。
イテラブルオブジェクトという言葉はよく出てくるので覚えましょう。
4.4. break文とcontinue文とループのelse節
break文は、for文やwhile文のループ処理を中断することができます。
else節はif文のような条件分岐においては、いずれの条件にも当てはまらない場合に実行する処理に使用します。
ただ、このelse節はループ処理にも使いことができます。
ループ文でのelse節は、for文であればすべての要素を使い終わったとき、while文であれば条件がFalseになった時に、else節の処理を実行します。
例として、素数を探すループ処理にelse文を活用してみます。
もうちょっと詳細な動作に落とし込むと、やりたいことは以下の通りです。
■期待する出力
2~9までの数字で、素数であれば「prime number」と返し、素数でなければ素因数分解に近いことを行う。
■詳細動作
- for文とrange()で、2~9までの数字を順番に取り出す(取り出した数字を仮にnとする)。
- 2 < x < nとなる整数xを順番に取り出し、n / xの余りが0になった場合、xとn / xの商を取り出しループを中断(break文)。
- 2のループ処理においてすべてのxに対し、n / xの余りが0にならなかった場合(else節)、そのnは素数と判定。
■ソースコード
for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n, 'equals', x, '*', n//x) break else: print(n, 'is a prime number')
■出力
2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3
ソースコードで注意すべきは、else節のインデントレベルが、if文ではなく2行目のfor文と同じレベルであることです。
この場合、2行目のfor文が完結した(=すべてのxでn / xの余りが0にならなった)場合のみ、else節でnは素数と判定することができます。
continue文は、ループ処理において以降の処理をスキップして、次のループへ進めることができます。
continue文を使った例として、
- range()関数を使って、2~9の数列を生成
- for文のループで、各要素を2で割って余りが0かどうかを評価
- 0であれば偶数と判定し次のループへ、0でなければそのまま出力
for num in range(2, 10): if num % 2 == 0: print("Found an even number", num) continue print("Found a number", num)
Found an even number 2 Found a number 3 Found an even number 4 Found a number 5 Found an even number 6 Found a number 7 Found an even number 8 Found a number 9
4. pass文
pass文は何もしません。
この先いろいろな構文を学びますが、構文上書く必要があるが、処理の必要がない場合にpass文を使います。
例えば、
while True: pass
while文はfor文に似た構文ですが、条件がFalseになるまでループ処理を行います。
また、ループ処理を行うために、処理の内容を書く必要がありますが、上記のように”pass”と書くことで、処理をすることもなくループさせることができます。(例は、無限ループ処理をするので実行した場合、Ctrl+Cなどで中断する必要があります。)
pass文の動作は理解できたかもしれませんが、必要性について理解できていないかもしれません。
(そもそも処理させるためにコード書いてるのに、処理させないってなんぞ???)
1つの利用方法としては、あなたが新しいコードを書いて動作検証を行う場合、pass文で仮置きすることで、大まかな動作確認をすることができます。
結構長くなったので、この章は一旦終了。
その2へ。