リファクタリングをPythonで実践!基本手法とコード例・注意点まで
1.Pythonとは?
Python(「パイソン」と読みます)はAIやデータ分析が得意で初心も学習しやすい特徴があり、人気の高いプログラミング言語です。もともとは機械学習の分野でよく使われていました。ただ汎用言語なので、Webアプリケーションの開発、RPA、画像解析など幅広い分野で活用されています。
Pythonを使用する開発現場も多くなっています。なぜPythonは学習しやすいのでしょうか?それは他の言語に比べ記述がシンプルで、覚えることも比較的少なく、プログラム全体の構造も見通し良くできるからです。
2.Pythonにおける「リスト」とは?
Pythonにおける「リスト」とは、データを一直線にまとめたものです。
a = [1, 2, 4]
このようにデータをまとめることで、複数のデータにaという変数名でアクセスできます。
リストは要素の追加や削除ができますし、要素の値を変えることもできます。また、要素のデータ型は混在していても構いません。リストの要素として更にリストを持たせることもできます。
要素にはインデックスでアクセスします。インデックスとは並び順のことです。インデックスは0から始まるので注意してください。
上記のaなら
a[0] → 1
a[1] → 2
a[2] → 4
です。
リストの長さを超えたインデックスを指定するとエラーになります。非常にデータが扱いやすくなり、プログラミングしやすくなります。
なお、他には、要素の値を変えられない「タプル」、インデックスではなく文字列でアクセスする「辞書」もあります。
3.Pythonでのリストの使い方
①リストを作成する
最も基本的なリストの作り方は、要素を「,」で区切って全て書くことです。
a = [1, 2, 4]
空のリストを作ることもできます。この場合は、後述する方法でリストに要素を追加します。
a = []
②リストの要素をスライスする
「スライス」とは、リストの一部を別なリストとして取り出すことです。
a = [1, 2, 4]
b = a[1:3]
print(b)
出力結果:
[2,4]
スライスは[開始位置:終了位置]で指定します。ただし、終了位置の要素は取り出されません。終了位置-1までの要素が取り出されます。位置は最後の要素からの位置で指定することもできます。この場合、「-」を付けます。
a = [1, 2, 4]
b = a[1:-1]
print(b)
出力結果:
[2]
開始位置、終了位置は省略できます。すると、最初から指定、最後から指定したことになります。
a = [1, 2, 4]
b = a[1:]
c = a[:1]
print(b)
print(c)
出力結果:
[2,4]
[1]
スライスを実際に使うのは、リストの最後の要素を取り出すとき、最初の要素を除いたリストを取り出すときが多いです。頻出する書き方なので覚えておきましょう。
a = [1, 2, 4]
b = a[-1:]
c = a[1:]
print(b)
print(c)
出力結果:
[4]
[2,4]
③リストへの要素の追加
リストに要素を追加するのはappend()を使います。
a = [1, 2, 4]
a.append(7)
print(a)
出力結果:
[1,2,4,7]
空のリストを作っておいて、処理で取得した値を次々リストに追加する手法はよく使われます。
④リストへの要素の挿入
リストに要素を挿入するのはinsert()を使います。
insert(インデックス,値)
で挿入します。
a = [1, 2, 4]
a.insert(2, 7)
print(a)
出力結果:
[1,2,7,4]
⑤リストの要素の削除
リストの要素の削除方法は3種類あります。まずインデックスで指定して削除する方法。delを使います。
a = [1, 2, 4]
del a[0]
print(a)
出力結果:
[2,4]
次に、インデックスを指定し、その値を取得し、削除するpop()という方法があります。
a = [1, 2, 4]
b = a.pop(0)
print(a)
print(b)
出力結果:
[2,4]
1
pop()でインデックスを指定しないと、末尾の要素の値を取得し、削除します。
a = [1, 2, 4]
b = a.pop()
print(a)
print(b)
出力結果:
[1,2]
4
最後に、値で指定して削除するには、remove()を使います。
a = [1, 2, 4]
a.remove(4)
print(a)
出力結果:
[1,2]
⑥リストの結合
リスト同士を結合するのにはextend()を使います。
a = [1, 2, 4]
b = [5, 7]
a.extend(b)
print(a)
出力結果:
[1,2,4,5,7]
このとき、append()を使うと別なリストが要素として結合されます。挙動が違うので注意してください。リストの要素としてリストを持たせることも可能でしたね。
a = [1, 2, 4]
b = [5, 7]
a.append(b)
print(a)
出力結果:
[1,2,4,[5,7]]
⑦リスト内包表記
内包表記はリストを作成するときの方法です。
例えば、
a = [i**2 for i in range(10)]
と書くと、aは
[0,1,4,9,16,25,36,49,64,81]
になります。
とっつきにくいかもしれませんが、手早く計算させて簡潔なコードにする目的で使われます。内包表記は様々なバリエーションがありますが、あまり込み入ったコードを書くと可読性が下がるので、おすすめしません。この程度に収めておきましょう。
⑧リストの初期化
リストを初期化するにはclear()を使います。clear()すれば空のリストになります。
a = [1, 2, 4]
a.clear()
print(a)
出力結果:
[]
⑨リスト内の検索
リスト内にその値の要素があるかないかは、inを使って検索できます。if文で使います。
a = [1, 2, 4]
if 4 in a:
print('4がaにありました')
if 7 in a:
print('7がaにありました')
出力結果:
4がaにありました
not inとすると要素がないことを検索します。
a = [1, 2, 4]
if 4 not in a:
print('4はaにありません')
if 7 not in a:
print('7はaにありません')
出力結果:
7はaにありません
⑩リストの要素の並び替え
並び替えのことを「ソート」と呼びます。リストをソートするときはsort()を使います。ただsortとすると昇順にソートされます。
a = [1, 2, 4]
a.sort()
print(a)
出力結果:
[1,2,4]
降順にソートしたいときはreverse=Trueとします。
a = [1, 2, 4]
a.sort(reverse=True)
print(a)
出力結果:
[4,2,1]
4.リスト操作で使用するメソッドの一覧
メソッドとは特定の処理に名前をつけたものです。プログラム中で呼び出すことで、さまざまな処理を実現できます。
①append()
リストに要素を追加します。
a.append(7)
②insert()
リストに要素を挿入します。insert(インデックス,値)と書きます。
a.insert(2, 7)
③pop()
指定したインデックスの要素の値を取得し、その要素をリストから削除します。
a.pop(0)
④remove()
指定した値の要素をリストから削除します。
a.remove(7)
⑤extend()
リスト同士を結合します。
a.extend(b)
⑥clear()
リストを初期化し、空のリストにします。
a.clear()
⑦sort()
リストを昇順または降順(reverse=True)でソートします。
a.sort()
a.sort(reverse=True)
⑧index()
その値の要素のインデックスを調べます。
a = [1, 2, 4]
b = a.index(4)
print(b)
出力結果:
2
⑨len()
リストの長さを取得します。
a = [1, 2, 4]
b = len(a)
print(b)
出力結果:
3
5.Pythonのリストでよくある失敗や注意点
少し深い話をすると、Pythonでは数値や文字列は代入した瞬間に別物になるのですが、リストは代入しても「参照」のコピーが作られるだけで、完全に別物にはなりません。
例えば、
a = [1, 2, 4]
b = a
b[0] = 10
とすると、
a → [10, 2, 4]
b → [10, 2, 4]
と、bだけ変えたはずが元のaまで変わってしまいます。
これはPythonのプログラミング全般に言えることで、数値や文字列以外は、代入しても完全にコピーされるわけではないのです。他のプログラミング言語も同様なのですが、この点は注意が必要です。その性質をうまく生かしたプログラミング技法もあります。クラスの処理でよく使われます。
この点について言及するのはこの記事の範囲を超えるので、そういうことになっている、とだけ覚えておいてください。