ヌルポインター親衛隊

社内でひとりエンジニアやってます。

Python学習2日め

今日は『独学プログラマー』6章からはじめ、教習所に行くまでに9章のチャレンジ手前まで終えた。20時過ぎに帰ってきて、お湯を張った湯船に浸かり、9章の残りと10章に取り掛かる。これまでにも少しPythonに触ったことがあったため、文法的な部分は概ね理解していたが、関数やメソッド、オブジェクトといった概念の定義と理解が追いついていなかったフシがある。しかし、学習の2日目にして、頭の中でかなり整理ができてきたので、初学者が間違えそうな(そして私もごっちゃになっていた)ことをまとめてみたい。

オブジェクト

オブジェクト(Object)とは、変数やら、文字列やらの、プログラム上で開いたファイルといったものがこれに当たる。まだ第二部に入っていないが、オブジェクトについてより詳しく書かれたp173をチラ見してみると、

Pythonのすべてのクラスは、objectクラスを継承します。

と書かれていた。行動は言葉よりも雄弁に語る、もとい「コードは言葉よりも雄弁に語る」ため、下に一例を示したい。これは、hoge.txtを開き、内容を標準出力することを期待したプログラムだ。

with open("hoge.txt", "r") as f:
    print(f)

これを実行すると、次のような出力が得られる。

<_io.TextIOWrapper name='hoge.txt' mode='r' encoding='cp932'>

print()は、ありとあらゆるオブジェクトをその型に合わせてフォーマットして標準出力するメソッドである(...と推測した)。であるならば、これはファイルオブジェクトfを然るべき形にフォーマットして標準出力していると思われる。しかし、望む動作はファイルの中身を出力することであり、ファイルオブジェクトを出力したいわけではない。だから、こうだ↓。

with open("hoge.txt", 'r') as f:
    print(f.read())

この場合、f.read()が返すのはstrオブジェクト(文字列)である。必要なオブジェクトの型や、オブジェクトの性質を理解していれば、このような混乱も無くなるはずだ。

for文とwith文

for文のフォーマットは以下の通りである。

for [変数名] in [イテラブルなオブジェクト]:
   [繰り返す処理]

自分は英語ができないので、所見で「イテラブルってなんぞや?」となったが、連続していて、一つづつ取り出すことができるを意味するらしい。

次に、with文のフォーマットを以下に示す。

with open([ゴニョゴニョ]) as [変数名]:
   [処理]

ほー。これは見事な英語の構文...。
英語はできないと思ってたけどこれなら解る。asは"~として"の意味だと思うたぶん。だから、open()したオブジェクトを[変数名]に格納することを伴って(with)[処理]をする、という意味。for文と[変数名]の位置が違うから一抹の気持ち悪さを感じもしたが、要は英語だと分かればこっちのもん。この構文は非常に理に適っている。

おわりに

恐らく第一章はイントロダクションで、第二章からが非プログラミング初学者(しかしオブジェクト指向は初学)向けだと思うので、明日からは本腰を入れて取り組みたい。クラスとかオブジェクトとかは使ったことこそあるが、明確に理解したことはないので、この機に理解したい。