今回もPythonの基礎の続きになります。
前回はこちら
[100日後にエンジニアになるキミ - 28日目 - Python - Python言語の基礎4]
(https://qiita.com/otupy/items/f9324f682df276b44ed3)
制御文
前回の講義まではpythonの基本的なデータ型や
演算子の使い方などをお伝えしてきました。
pythonでは条件分岐や繰り返しなど
プログラムを制御するための文法が存在します。
それを制御文と呼んでいます。
制御文はプログラミングを行う上で
欠かせないもので
あらゆるところで出てきます。
書き方、使い方を押さえておきましょう。
if文
if文は条件分岐を行うための構文です。
if文の書き方
if 条件:
処理
if 条件:
処理
else:
処理
if 条件:
処理
elif 条件 :
処理
・・・
まずはIF単独の場合
条件を書いて:
セミコロンを末尾に書きます。
# if文で条件に合致した場合printする
if 1<2:
print('1より2の方がおっきい')
1より2の方がおっきい
その条件に合致した場合にだけif文の中の処理が実行できます。
なお注意として制御文を使う場合、処理を書くブロックは
インデント(字下げ)
といって空白4つ分ずらしてあげないといけません。
また空白4つはタブボタンでも代用可能です。
if 1<2:
print('1より2の方がおっきい')
IndentationError: expected an indented block
インデント
を行わないとエラーになります。
# 条件はTrue or False
hh = 8
if hh== 8:
print(hh)
8
if文では条件は bool型
、真偽値
になるものを採用できます。
次に条件に合致しなかった場合は
if文のあとに else:
と書いて
条件に合致しない場合の分岐処理も書くことができます。
hh = 7
if hh== 8:
print('{}時だよ、全員集合'.format(hh))
else:
# 条件に合致しなければこちらが実行される。
print('{}時だよ、全員解散'.format(hh))
7時だよ、全員解散
条件が複数ある場合
elif 条件:
で条件を増やすことができます。
hh = 9
if hh== 8:
print('{}時だよ、全員集合'.format(hh))
elif hh==9:
# 条件に合致すれば実行される。
print('{}時だよ、全員遅刻'.format(hh))
else:
# 条件に合致しなければこちらが実行される。
print('{}時だよ、全員解散'.format(hh))
9時だよ、全員遅刻
if文では条件が合致したところだけ実行されます。
条件を分岐させたい時にだけelse
やelif
を使えば良いです。
条件が複数にまたがる場合
ネスト
と言って、if文の階層を作ることができます。
その場合、if文の階層の分だけインデント
を行います。
aa = 2
bb = 50
if aa == 2:
if bb == 50:
print('江頭{0}時{1}分'.format(aa,bb))
else:
print('江頭{0}時'.format(aa))
else:
print('江頭')
江頭2時50分
インデント
の位置で処理が変わってしまうので注意しましょう。
ネストを使うことでどんな条件でも
書き分けることができるようになります。
ただし、あまりネストを使いすぎると
わけわからなくなってきます。みるのも大変です。
あまり深い階層になってしまった場合は
そもそもの処理や条件などを見直した方が良いと思います。
またif文では何かしら処理を書かないとエラーになってしまいます。
if 1<2:
SyntaxError: unexpected EOF while parsing
特に処理を思いつかない場合はとりあえず pass
というのを書きます。
if 1<2:
pass
pass
は何もしない処理を現します。
制御文だけを書いて、処理を書かずに実行すると
エラーになるので回避のために使えます。
pythonではインデント
で処理するブロックが変わってきます。
なのでif文の中の処理なのか、その前の処理になるのかで
全体の処理が大きく変わってくることがありますので
どういう処理をさせるのかを考えてインデント
をしてください。
for文
pythonで処理を繰り返し
行う場合は for
を使っていきます。
forの書き方
for 任意の変数名 in イテラブルオブジェクト:
処理
イテラブルオブジェクトとは?
イテラブルオブジェクト
とは、繰り返しができるオジェクト
要は複数要素をもつオブジェクトの事のことです。
例えば変数に文字列
を格納すると
aaaa = 'abcde12345'
print(aaaa)
abcde12345
これは文字列のオブジェクト
になります。
オブジェクト指向ではデータ
をオブジェクト
として扱うので
データを格納した変数
もまたオブジェクト
と同じものだと言えます。
ではイテラブルオブジェクト
ってなんでしょうか?
これは繰り返しができるという意味で、
複数要素をもつオブジェクト
のことになります。
要はリスト型
や辞書型
や文字列型
のようなデータ構造のオブジェクトとなり
Python言語ではこのオブジェクトを用いて繰り返しを行います。
簡単なfor文の例
# 5回繰り返し処理を行う
for i in [1,2,3,4,5]:
print(i)
1
2
3
4
5
これが一番シンプルな繰り返しです。
for
文の中の繰り返される処理の部分はインデント(字下げ)
をしてください。
繰り返し行う回数というのがin
のあとに書いた
イテラブルオブジェクト
の要素数分だけ行われます。
for
の後に書いたi
という変数は
繰り返しの中で使うことのできる変数になります。
それぞれ1回目はこのリストの1つ目がこのi
に代入される
2回目は2つ目・・・
という仕組みになっているので
このリストの要素数分だけ処理が実行されるという仕組みです。
リストは変数に代入しておいても同じように動きます。
# リスト型の変数に6つの要素を格納する
sample_list =[ 1,2,3,4,5,6]
# 6回繰り返し処理を行う
for i in sample_list:
print(i)
1
2
3
4
5
6
回数を指定したい場合
range()
関数で回数分の値を生成する。
for
に使用する回数部分はイテラブルオブジェクト
でなければならないため
代わりにrange()
関数でオブジェクトを生成して代用をします。
range()
関数では指定した個数のオブジェクトを作成できるので
for文の回数指定に代用できるという仕組みです。
range関数の書き方
range(整数値)
range(開始,終了)
range(開始,終了,間隔)
range()
関数は引数に指定した整数値の分だけ
数値を生成してくれます。
引数を追加すると開始、終了の数値、間隔を調整する事もできます。
# 10個の数値を持ったオブジェクトを生成
print(range(10))
range(0, 10)
range関数
の結果はrange型
になります。
ただしこれはリスト型
ではないので分かりづらいです。
リスト型
に変換してみましょう。
print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
これでリスト型
になり中身がわかりやすくなります。
range()
関数では0から始まって引数分だけ整数値を生成しますが
注意点としては0から始まるので終わりは指定した値にならないので注意してください。
指定した値 -1
になっています。
for i in range(3):
print(i)
0
1
2
# range関数で4回だけ実行する場合
for i in range(4):
print(i)
0
1
2
3
開始終了を指定する場合、第一引数から始まって、第二引数まで、となります。
この場合は5
から10
の1つ手前までの値を生成します。
# 5から9まで
for i in range(5,10):
print(i)
5
6
7
8
9
第三引数を指定すると、どれだけ加算するかを決められます。
マイナスを指定すると、引いていくこともできます。
# 2から10手前までの偶数
for i in range(2,10,2):
print(i)
2
4
6
8
# 20から10手前までの3個飛ばしで
for i in range(20,10,-3):
print(i)
20
17
14
11
文字列での繰り返し
繰り返しは基本、なんらかのオブジェクトを用いてその要素数だけ実行するか
range()
関数を使って指定した回数だけ実行するか
ということになります。
文字列を指定すると、その文字数分だけ実行されます。
# 文字列型の文字数だけ実行する場合
for i in 'apple':
print(i)
a
p
p
l
e
繰り返しの途中で抜ける場合(break)
for文の中で処理を抜けたい場合はbreak
を用います。
breakが実行されるとfor文のブロックを抜けることになります。
li = ['Alice', 'in', 'Chains']
for name in li:
if name == 'in':
print('!!BREAK!!')
# ここで抜ける
break
# 2回目の処理は行われない
print(name)
Alice
!!BREAK!!
この場合は繰り返しの2回目でif文の条件に引っかかり、
その中のプリント文とbreak
が実行されます。
そうなると途中で抜けた場合は、抜けた後以降の処理は行われません。
結果として2回目のプリントの前に抜けた、ということになります。
for文でもelse
が使用できます。
else
の部分は一番最後に実行されます。
for i in ['Alice', 'in', 'Chains']:
print(i)
else:
# for文の後に実行される
print('処理終了')
Alice
in
Chains
処理終了
breakによって途中絵終了した場合には
else
の処理は実行されません。
li = ['Alice', 'in', 'Chains']
for name in li:
if name == 'in':
print('!!BREAK!!')
break
print(name)
else:
# break後は実行されない
print('!!FINISH!!')
Alice
!!BREAK!!
処理の途中で処理を飛ばす場合(continue)
break
は完全に処理を抜けてしまいますが
処理の一部だけを飛ばして、まだ処理を続けたい時は
continue
を使います。
li = ['Alice', 'in', 'Chains']
for name in li:
if name == 'in':
print('!!continue!!')
# ここで処理を飛ばす
continue
# continue後は実行されない
print(name)
else:
# 最後に実行される
print('!!FINISH!!')
Alice
!!continue!!
Chains
!!FINISH!!
for文はプログラムの中でも高頻度で使われるもので
プログラムでは必須です。
どう処理を組み立てれば良いかを考えながら
for文を用いていきます。
特に2回以上行うような複雑な処理を2回以上書くよりは
for文1回で済ませてしまう方が楽になるので
使い方なども研究してみてください。
while文
制御文の最後は while文です。
for文では繰り返しの回数が決まっていましたが
whileでは条件を満たすまで繰り返し続けます。
whileの書き方
while 条件 :
処理
処理を書くところはインデント(字下げ)
が必要になります。
while True:
しかしこう書いてしまうと、繰り返しがずっと行われてしまい
いつまでたっても終わりません。
jupyter notebook上で止めたい場合は
画面上部の四角ボタン(停止)
を押して止めてください。
while文は条件を抜けるような処理を書いてあげないと
永久ループになってしまうので、注意が必要です。
while文の例:
sample_int =1
while sample_int <= 10:
print(sample_int)
sample_int = sample_int + 1
1
2
3
4
5
6
7
8
9
10
このようにして、変数などを条件に用いてwhile文の中で
変数を条件に合致しないように変更すると
whileの繰り返しを抜けることができます。
あらかじめカウント用の変数を用意したり、
フラグ値を用いたりすることでwhile文
を抜けるのが
一般的な使い方になります。
forと同じようにcontinue
やbreak
も使えます。
i=0
while i<5:
if i ==2:
i+=1
continue
print(i)
i+=1
0
1
3
4
i=0
while i<5:
if i ==2:
break
print(i)
i+=1
0
1
continue
は条件が満たされ続ける限りは
繰り返しが実行され続けるので注意しましょう。
まとめ
条件分岐や繰り返しなどの制御文は
プログラミングではどの言語でも存在する重要な部分です。
文法を把握して、正しくプログラムが実行されるように
コードが書けるようになりましょう。
君がエンジニアになるまであと71日
作者の情報
乙pyのHP:
http://www.otupy.net/
Youtube:
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw
Twitter:
https://twitter.com/otupython