for
文のやりがちなミスを下記記事で紹介しました。
本記事ではfor
文以外のやりがちなミスを集めていきたいと思います。
同じ名前を付ける
同じ名前を付ける というミス。やりがちです。
色々なパターンがありますが、モジュール名を変数名に付けてしまうパターンが多いように思うので、そのパターンを見てみましょう。
import time
result = 0
time = time.time()
for i in range(1, 101):
result += i
end_time = time.time()
print('1から100を足した合計は', result, 'です。')
print('計算時間は',end_time - time, '秒です。')
これは「1〜100の整数を全て足した合計を求め、その結果と計算時間を表示する」というプログラムを書こうとしたものですが、このまま実行すると、
エラーになってしまいます。
エラーになったのは10行目。エラーの種類は「AttributeError」。
AttributeErrorは直訳すると「属性エラー」ですが、無いメソッドなどを書くとこのエラーになります。
エラーメッセージは「’float’ object has no attribute ‘time’」とあるので、time なんて無いよ〜と教えてくれています。
え?でも、5行目でも同じ書き方してるのに、これはエラーにならないの?
そうなんですよね。
このミスの特徴の1つとして、2箇所で同じ書き方をしているのに、先に書いた方はエラーにならず、後に書いた方だけエラーになっていることがあります。
今回の例はエラーが起きるようにワザとミスをしているので、あからさまですが、計算時間を求めるためにtime
というモジュールをインポートしていますが、プログラムの中でtime
というモジュールと同じ名前の変数を定義してしまったことがエラーの原因です。
5行目のtime.time()
の左側のtime
はインポートしたモジュールを指していますが、10行目のtime.time()
のほうは5行目で定義した変数のtime
になっています。
ということで、修正は簡単です。変数名をtime
から変更してあげるだけですね。
修正版のコード
import time
result = 0
start_time = time.time()
for i in range(1, 101):
result += i
end_time = time.time()
print('1から100を足した合計は', result, 'です。')
print('計算時間は', end_time - start_time, '秒です。')
一部分だけデータの型が異なっている
これはPythonに限らないのですが、よく見かけるミスです。
何百、何千行もあるような量の多いデータを取り込んで処理をしたり、Web上になるデータをスクレイピングしてきて処理したりする場合によく見かける気がします。
データのほとんどはint
だったりfloat
だけど、一部分だけstr
になっていたり、データが抜けていたりして、エラーになってしまうようなケースです。
例えば、こんなケース。
PandasのDataFrameとして数値データを取り込んで、月毎の平均値を出しているようですが、、、
なぜ2月と3月だけ表示されないんだろう。。。
と悩まれている方を最近見かけました。
その原因はこちら。
外部からデータを取り込んで処理する際は、そのデータが想定通りの型になっているか、必ずチェックするようにしましょう。
リストの append() メソッドは None を返す
リストのappend()
メソッドの使い方を間違えているケースもたまに見かけます。
間違った使い方
sample_list1 = []
new_list = sample_list1.append(1)
print(new_list)
上記の実行結果
None
append()
メソッドはリストに値を追加したい場合に使いますが、リストに値を追加するだけで、追加後のリストは返さずに、None
が返ってきます。
正しい使い方
sample_list2 = []
sample_list2.append(1)
print(sample_list2)
上記の実行結果
[1]
Google Colaboratory
掲載しているコードは Google Colaboratory で確認できます。
環境構築の不要な Google が提供している Webサービスなので、Python を学習中の方にはオススメです。
おわりに
やりがちなミスって意外とあると思うので、気になったものがあったらドンドン追記していきます。
こんなのもあるよ〜というのがあればぜひ教えてください。
以上です。
コメント