[Python #17] 初学者あるある(初心者向け)

はじめまして!今月から新しくPythonチームに参加しましたA.Kです。

自己紹介

今回が初めての投稿なので、簡単な自己紹介をさせていただきます。

私は京都府の大学に通っている大学4年生です。出身は兵庫県で、遠いなと思いながらも、実家から通っています。大学では機械工学を専攻していて、熱機関(いわゆるエンジンやタービン)の仕組みや,ロボットの制御,振動などについて学んでいます。

このように、専攻は情報系ではないのですが、大学の講義で少しかじったC言語やMATLABによる画像解析が周りの人よりも得意だったので、プログラミングスキルを磨きたい!という想いでPythonチームに応募しました。

趣味は歌とギターです。弾き語りをするのが好きで、中でもMr.Childrenの”HANABI”は大好きで、よく研究室で弾き語りをしています。 一人遊びとして「ギター」はとてもおすすめです。「今から始めても遅い」と思うかもしれないですが、私自身、大学に入学してから始めた身ですし、基本的なコード(和音)さえ鳴らせるようになれば、弾き語りのそれっぽい感じが出ますし楽しいです。そのレベルになるまで少々大変ですが、私の場合、1か月頑張ってそのレベルに達することができました。

さて、私の自己紹介はここまでにして、本題に入ろうと思います。 今回は、Pythonチームに配属される前に合格しなければならない、1か月の試用期間の課題、そこで大変だったことについて語ろうと思います。

試用期間の課題

課題は、PythonでWebスクレイピングをできるようになることです。WebスクレイピングとはWebサイトからWebページのHTMLデータを取得して、特定のデータを抽出する技術のことです。試用期間中にこの技術を身に付けることが求められます。

弊社のインターンに応募してからPythonについて学び始めた私にとっては、この課題には結構苦しめられました。 今思えば、課題自体の難易度は高くはないのですが、Pythonについて何もかもが初めてなので、スクリプトの実行環境を思うように作れなかったり、スクリプトは実行されてエラーメッセージも表示されないのですが、思うような出力が得られなかったりと、格闘していました。

プログラミング初学者あるある

でも、これら上記の格闘はプログラミングの初学者あるあるですよね。Python以外でも、何かプログラミング言語を学んだことがある方には共感していただけると思います。

近年、「プログラミング学習」が流行っており様々な学習サイトやスクールができて、プログラミング学習を始める人がたくさんいるのに、多くの人が学習を諦めて辞めてしまう理由は、初めて受けるエラーにあると思います。

たいてい、初学者じゃなくてもエラーメッセージが表示されると辛い気持ちになると思います。(エラー出そうだなーと思いながらコードを書く人なんていませんもんね。せっかく作成した自分のコードが「ダメです!(エラー)」と表示されれば辛いはずです。)

でも、安心してください。エラーメッセージはそのままコピーしてGoogle検索すれば、同じようなエラーが発生して困っていた先人達が解決方法を示してくれています。

エラーメッセージはスクリプトを実行する際に「どこで」「何が」悪かったかを示してくれるものです。エラーが出ても恐れずに処理しましょう。

エラーの種類

せっかくですので、個人的に思い入れのあるエラーについて紹介したいと思います。

SyntaxError

MATLABを使用していたときに、個人的に一番お世話になったエラーです。そして、いちばん嫌いです(笑)エラーの例を考えようと思ったときに真っ先にこれが思い浮かびました。

意味は「構文エラー」です。

a = sum(1,2,3,4,5

一例として上記のスクリプトを実行すると

SyntaxError: ')' was never closed

このようなエラーが表示されます。意味は表示にある通り「()が閉じれていない」です。

なんだ易しいエラーじゃないかと思うかもしれないですが、Python以外の言語だと、if文がendで閉じれていない場合だったり、1行の中に複数の()を使うコードを書いたときによくお世話になりました。

今回の課題中にお世話になった覚えはあまりないですが、個人的に思い入れが強いので紹介しました。

ちなみに

a = sum(1,2,3,4,5)

正しく書くと上記のようになります。

IndentationError

Pythonではif文やforループを使ったときに、その処理をendで閉じる必要が無い代わりにインデントを重視します。

初めてこれを知ったときはとても驚きましたし、endで閉じないことを気持ち悪いと感じてしまいました。

if True
    print("HAPPY")
  else
    print("SAD")

上記のスクリプトを実行すると

IndentationError: unindent does not match any outer indentation level

このようなエラーが表示されます。これはelseの前に半角スペースが入っており、インデントが揃っていないという意味です。

ちなみに、

if True
    print("HAPPY")
    else
    print("SAD")

上記のように間違ったインデントにelseを揃えると

SyntaxError: invalid syntax

if文の無いインデントにelseを置いてしまっているのでSyntaxError(構文エラー)が発生してしまいます。「そのくらい空気読んで処理してくれよ」と思いませんか?

だからSyntaxErrorは嫌いなのです(笑)

正しいコードを以下に記します。

if True
    print("HAPPY")
else
    print("SAD")

AttributeError

オブジェクトの型が間違えているときに発生するエラーです。

例えば

b = 1
b.append(2)

上記のようなスクリプトを実行すると

AttributeError: 'int' object has no attribute 'append'

このようなエラーが表示されます。これは、aapendメソッドが対応しているのはlist型であるが、bはint型だから発生しています。

正しくは

b = [1]
b.append(2)

このようになります。

エラーが表示されないバグ

厄介なのは、エラーメッセージは表示されていないのにも関わらず、思うような出力が得られない場合です。 私が格闘していたのは主にこちらです。

このデバッグは正直「気合い勝負」だと思います。

動作が正常に処理されていない箇所を洗い出して、その処理について検索したり、思うような出力が得られるためにどうすればいいのかを学習したりする必要があります。これを成功するまでおこなうという「気合い」が必要です。プログラミング学習についてはこの「気合い」がとても重要で、デバッグ完了まで諦めないということが、プログラミング言語習得のカギだと私は思います。

とは言っても、私自身、seleniumライブラリでWebスクレイピングをおこなっている際、スクリプトの実行は正常に終了しても、csvファイルに結果が出力されないというエラーが発生してしまい、辛くて諦めようかと思ってしまった身です。このようなエラーとの格闘は、誰しもが通るはずだと思うので、粘り強く、頑張っていきましょう!

最後に

今回の試用期間で、私はPythonでのWebスクレイピングを身につけることができました。

これだけでも、弊社のインターンに参加した大きな意義になったと思います。 これから、様々な業務があると思いますが、「気合で」乗り越えて色々な技術を身につけていきたいと思っています。

参考

Pythonの基本的なエラー一覧とその原因の確認方法