著作一覧 |
読むだけなら読めるのだが(というか読めないと読めない本が結構ある)自分では書いたことがないのでちょっとPythonを勉強しようと思って手持ちの本を探したら、ほぼ手つかずの、以前アスキーの鈴木さんから頂いたエキスパートPythonプログラミングと、その改訂2版が出てきたので読んだ。
改訂2版が出ているので当然そちらを読む。
が、これは残念なことにプログラミング言語の入門書ではなかった。
文字通りプロのPythonプログラマーのための、実用プログラムを作って残して保守するための方法についてのガイダンスだった。
Python2とPython3の違いや、文字列とバイト列の使い分け(プレフィクスで決まる)、イテレータ、ジェネレータ、デコレータ、コンテキストマネージャの上手な使い方(残念、おれにはユースケースがそもそも見えていないので特にデコレータは書いてあることはわかるのに、何をしたいのかよくわからなかった。AOPするための機構と考えれば良いのかなぁ。コンテキストマネージャはC#のusingのためのdisposeみたいだと思ったが、インターフェイスの代わりに関数名で拡張するわけだな)、パッケージング(Rubyで言えばGemの作り方みたいな感じだな)、C拡張ライブラリ作成ガイド、TDD、ドキュメンテーション、最適化などが網羅されている。
というわけで読んでみて良い本だとは思ったが(というよりも、仕事でPythonプログラムを書いているのなら必携書じゃないか?)、今のおれの需要には答えてくれなかった。
エキスパートPythonプログラミング改訂2版(Michal Jaworski)で、しょうがないので本家のチュートリアルをやってみるわけだが、おれが知りたいことがない。
REPL(1行入力して、解釈させて、結果を表示するコマンドラインインターフェイス)が強力だからだろうか。
知りたいことは、普通に標準入力からデータを読み取って標準出力へ出力することなのだ。
が、これが出てこない。
せめてコマンドライン引数と思ったら、これも出てこない。(sysクラスが持っていることは標準ライブラリを眺めていてやっとわかった)
で、標準入力から数字の並び2つを取ると言う処理を書くだけに数時間がかかってしまって閉口した。
結局以下のようなコードになったが、本当にこんなやり方をするのが良いのかわからない。なんか異様に大袈裟な気がして落ち着かない。
import re import sys for line in sys.stdin: vals = re.findall(r'\d+', line) if len(vals) == 0: break first = int(vals[0]) second = int(vals[1]) ...
あと、LinuxマシンにPython3.5を入れたのだが、このバージョンでは埋め込み文字列(なんと使えないとわかった瞬間に忘れてしまったようだ。確かf'{first} {second}'のようだったような)が使えずに文法エラーになるのだが、埋め込み文字列が利用できないとは考えられなくて他の部分に書き間違いがあるのだろうtえらく時間が取られた。
結局、欲しいことは、printにカンマで並べれば(print(first, second))空白で区切って出力してくれることがわかったので、回り道のし過ぎだったようだ。
あとは普通のプログラムならlist、dictionary、array、range(for文書くのに必須だった)とリスト内包表記を抑えれば良いので楽ではあった(が、デコレータが必要となるようなプログラムを書く場合はまた別の話なのだろう)。
ジェズイットを見習え |