IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  Power Platform  最新技術動向  生成AI  Docker  Kubernetes 

第61回 Pythonプログラムでエラーを出す前に確認したいこと ~重複編~ (菱沼佑香) 2025年3月

こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。

前回で4章「わかりやすいネーミング」にという章の学習中です。この章では、変数の適切な名前の付け方を学び終えましたので、5章に入ります。
5章は「怪しいコード臭」でバグを未然に防ぐために、どういった点に注意した方が良いのか、対処するか否かの判断について学んでいくようです。今回は重複コードについてです。

重複コードを排除してエラーを回避する

私はエラーメッセージが表示されると、げんなりします。きっと慣れた方ならササっと修正できるのだと思いますが、どこに問題があるのかを探し出し、どう修正すればいいのかが大変なのです...。
Pythonは3.10以降からエラーメッセージの出し方を、より分かりやすいものにしていくということで、以前に比べればどの辺に問題があるのかわかりやすくはなりましたが、それでもやっぱりエラーが出るとげんなりします。
エラーメッセージが表示される前の書いている段階で怪しい場所に気づいて修正できれば、そう複雑にはならないのだろうと思いますが、そんなことできればエラーメッセージに悩まされませんし、そもそもどこを注意していけばいいのかわかりません。きっと私だけじゃない...はず...。
この章ではどこを見てエラーになりそうな場所を見つけるのかというポイントが説明されていきます。まずは重複したコードという項目です。

---------------------------------------------------------------
P.74
重複コードとは、他のコードをコピーして自分のプログラムに張り付けて作成した可能性のあるソースコードのことです。
(中略)
重複したコードが問題となるのは、コードの変更が難しいからです。重複コードの1か所を変更したら、プログラム内の全箇所を修正しなければなりません。どこかに変更を加えるのを忘れたり、コピーした部分の各々に異なる変更を加えたりすると、プログラムにバグが発生する可能性が高くなります。
---------------------------------------------------------------

こちらがテキストで紹介されていたサンプルコードです。

fig01

同じコードが3つあります。確かに後からやっぱこれ変えようとなったときに一つずつ直していくのはちょっと面倒ですし、抜け漏れはありそうです。なので、解決策としてはこの重複した部分を関数やループの処理を入れて排除し、一つにまとめてしまうというのが良いという事になります。

次から改善パターン3つ確認していきます。

1.関数を作り、繰り返し処理をする

こちらはprint(’I am happy t~の部分を関数化します。


def askFeeling():
    print(’How are your feeling?’)
    feeling = input()
    print(’I am happy to hear that you are feeling’ + feeling + ’.’)

print(’Good morning!’) askFeeling() print(’Good afternoon!’) askFeeling() print(’Good evening!’) askFeeling()

ただこれだと、挨拶文のところがなんだか野暮ったく感じます。わかりやすくていいですけれども。

2.重複するコードをループにする

こちらは挨拶文も一緒にループに入れてしまいます。

for timeOfDay in [’morning’, ’afternoon’, ’evening’]:
    print(’Good ’ + timeOfDay + ’!’)
    print(’How are your feeling?’)
    feeling = input()
    print(’I am happy to hear that you are feeling’ + feeling + ’.’)

すっきり。
1の例だと挨拶文は個別に用意していましたが、リストにしてしまえば、繰り返されるたびに順番に違う挨拶文が表示されるようになります。

3.関数とループを一緒に使う

2ではループですべて処理しましたが、こちらの例は関数で動きの部分を作り、ループに挨拶用のリストと、作った関数を実行するというものになっています。


def askFeeling(timeOfDay):
    print(’Good ’ + timeOfDay + ’!’)
    print(’How are your feeling?’)
    feeling = input()
    print(’I am happy to hear that you are feeling’ + feeling + ’.’)

for timeOfDay in [’morning’, ’afternoon’, ’evening’]: askFeeling(timeOfDay)

2の例よりは長くなりましたが、実行される内容とループしたときに表示される文章が分かれました。また、defで作った関数に引数(timeOfDay)をつけることで、同じ部分の重複が必要ないようになっているそうです。

最初のコードと3つの改善例を見てみると、ある意味シンプルで分かりやすいのは改善前のコードだと思います。が、とにかく見にくいなあというのが感想です。改善例3つで比較してみたときには私としては最後のものが読みやすいかなという印象でした。修正したいときに、修正箇所が少なく済むのもいいですよね。

重複まとめ

テキストには、重複を常に避ける必要はないけれど、重複するコードの部分が長いほど、そして、重複コピーの数が多くなるほど、重複を排除する方向で、ループや関数を使う修正を入れていった方が良いというようなことが書かれています。多少の重複程度では放置することもあるようです。

ただ、私の場合、一度出来上がって、特に問題なく動いたなら、正直変更するのが億劫になってそのまま使うんだろうな...という未来が見えました。個人的に使うもので、基本的に変更されないようなものなら問題ないんでしょうけれども。
変数の変更程度ならVS CodeでF2をすれば一括で変換できますが、文章の部分となるとできないので、なるべく最初から重複しないように書けるようになりたいものです。。

それでは今回はこちらで終了です。今回もお付き合いいただきありがとうございました。

 

 [IT研修]注目キーワード   Python  Power Platform  最新技術動向  生成AI  Docker  Kubernetes