リファクタリングをPythonで実践!基本手法とコード例・注意点まで
1.Pythonとは?
Python(「パイソン」と読みます)は最近注目を集めているプログラミング言語です。データ分析を得意としていて、機械学習の分野から使われ始めました。汎用言語なので、Web開発、Excelとの連携によるRPA、画像解析などに幅広く使用できます。
Pythonを使用する開発現場も多くなっています。プログラミング初心者にとって、Pythonは習得しやすい言語です。記述がシンプルで、覚えることは比較的少なく、プログラム全体の構造も見通し良くできるので、初心者に向いている言語なのです。
2.Pythonのfor文の基礎
①そもそも「for文」とは?
プログラムを作るとき、繰り返して処理をさせたい場合が数多くあります。for文は繰り返し処理に使われます。たとえば、あるデータのまとまりがあって、そのまとまりの要素一つひとつに処理を施す場合などにfor文は使われます。単純に処理を何回か繰り返す場合も、もちろんあります。
②Pythonでfor文を使用する際の書き方やルール
for文はリストやタプルから要素を一つひとつ取り出すのが基本形です。リストもタプルも複数のデータの集まりになります。
例を挙げます。
names = ['太郎', '次郎', '三郎']
for name in names:
print(name)
このコードを実行すると
太郎
次郎
三郎
と表示されます。
for name in names:
で、namesの要素をnameに取り出し、そのnameを直下にインデントした内容で処理します。for文の後には「:」を付けます。for文はインデントしたまとまりに処理させるので、複数の文を連ねることが可能です。
values = [200, 300, 500]
for value in values:
half_value = value / 2
print(half_value)
では、
100
150
250
と表示されます。一つめのまとまりで value を半分にし、次のまとまりでその結果を表示させています 。
③if文とfor文の組み合わせ
for文のまとまりの中に書くものに制限はありません。例えばif文も書くことができます。
numbers = [1, 2, 4, 7]
for number in numbers:
mod = number % 2
if mod == 0:
print(str(number) + 'は偶数')
else:
print(str(number) + 'は奇数')
このコードを実行すると
1は奇数
2は偶数
4は偶数
7は奇数
と表示されます。
④break文について
for文のブロックの中にbreakがあると、繰り返し処理を中止しfor文から抜けます。
numbers = [1, 2, 4, 7]
for number in numbers:
mod = number % 2
if mod == 0:
print('偶数なのでbreakします')
break
else:
print(str(number) + 'は奇数')
このコードを実行すると
1は奇数
偶数なのでbreakします
と表示されます。
このコードで、if文のブロックの中にbreakがありますが、抜けるのはその外側のfor文です。ここはPython初心者が勘違いしやすいポイントなので、留意してください。また、for文の中にfor文を置くこともできますが、この場合にbreakで抜けるのは一番近いfor文です。
⑤continue文について
for文のブロックの中にcontinueがあると、そこでその回の処理を中止し、次の回に進みます。
numbers = [1, 2, 4, 7]
for number in numbers:
mod = number % 2
if mod == 0:
continue
else:
print(str(number) + 'は奇数')
このコードを実行すると
1は奇数
7は奇数
と表示されます。
breakと同じく、if文の中にcontinueがありますが、処理を継続するのはfor文です。また、continueがあるとそれ以降の文は実行されないので、for文のブロックの最後に絶対に実行させたい処理が書いてあるなどの場合にはcontinueは使用できません。長いコードになるとうっかりcontinueさせて処理が実行されない、ということが起きるので、注意しましょう。
⑥elseについて
少し上級のテクニックになりますが、forに対してelseを書けます。このelseは、「breakで抜けなかった場合」に処理されます。
numbers = [1, 2, 4, 7]
for number in numbers:
mod = number % 2
if mod == 0:
print('偶数なのでbreakします')
break
else:
print(str(number) + 'は奇数')
else:
print('全て奇数でした')
このコードを実行すると
1は奇数
偶数なのでbreakします
と表示されます。
このコードではbreakが実行されるので、elseは実行されません。if文のelseとスペルは同一ですが働きは全く違うので、混同しないようにしましょう。
3.関数を使ったPythonのfor文
①range関数を使ったfor文の書き方と例
range関数は、「数からリストを作る関数」です。単純に回数分だけ処理したいときに使います。
range(10)
とすると、
0,1,2,3,4,5,6,7,8,9
のリストが作られます。
だから、
for i in range(10):
print(i)
は
0
1
2
3
4
5
6
7
8
9
になります。
②enumerate関数
enumerate関数は、要素とインデックス(何番目か)を同時に取り出すときに使います。
names = ['太郎', '次郎', '三郎']
for i, name in enumerate(names):
print(str(i+1) + '番目の人は' + name)
このコードを実行すると
1番目の人は太郎
2番目の人は次郎
3番目の人は三郎
と表示されます。
初めは何に使うのだろう?と疑問に思うかもしれませんが、インデックスも要素の値も使う場合は意外と多いものです。重宝する関数なので、覚えておいて損はありません。
③zip関数
zip関数は複数のリストから同時に要素を取り出すのに使います。
names = ['太郎', '次郎', '三郎']
numbers = [7, 2, 9]
for name,number in zip(names, numbers):
print(name + 'の背番号は' + str(number))
このコードを実行すると
太郎の背番号は7
次郎の背番号は2
三郎の背番号は9
と表示されます。
zipを使うとき、リストの長さが違うと長い方の最後の部分が切り捨てられます。また、ファイル圧縮のzipと同名ですが、全く関係ないので注意してください。
4.while文とfor文の違いと使い分け
while文は、条件がTrueのうちは実行し続けるループです。
i = 1
sum = 0
while(sum < 20):
sum += i
i += 1
print(sum)
このコードを実行すると
1
3
6
10
15
21
と表示されます。
sumが21になったところで処理が終わっていますね。while文は、主に入力値に対応して処理を調整するときに使います。ループの回数が予測できない場合ですね。回数が分かっている場合にはfor文を使います。
5.for文とリストの組み合わせ
例えば以下のコードを見てください。
numbers = [1, 2, 4, 7]
sum = numbers[0] + numbers[1] + numbers[2] + numbers[3]
print(sum)
このコードと、以下のコードと、どちらが処理を理解しやすいでしょうか?
numbers = [1, 2, 4, 7]
sum = 0
for number in numbers:
sum += number
print(sum)
numbersがもっと長くなったときに、numbersを変えるだけで済むのは後者のコードです。前者だといちいち加算するコードを改変しなければならず、保守性が大幅に低下します。これがリストに対してfor文を使用するメリットです。