カテゴリー: python

初心者によるPython勘所メモ

この記事は、Python初心者である私が『みんなのPython 改訂版』を読み進める中で、「お、Pythonてこんなことができるんだ」と思ったことを蓄積・随時更新していきたいと思います。

ちなみに、これまでに(業務・私用含めてですが)C、C++、Java、VBA(EXCEL,ACCESS)、PASCAL、PHP、PowerBuilder(windows上のGUI開発ツール)、昔懐かしいX68000でのアセンブラ、それとPerlをちょっと、といった程度にはプログラミング言語を使ってきました(もちろん、今となってはほとんど覚えていない言語もありますが…)。

他の言語でもできるようなことをひとおとりまとめる、というようなことは、Python リファレンスマニュアルや他にも優秀なサイトさんがたくさんありますのでそちらにまかせて、あくまで独断と偏見でということです。自分へのリマインドの意味合いが強いです。

「もっとこんなこともできるんだぜ!」「Pythonの真髄はこれだ!」というコメント大歓迎です。なにぶん初心者なので、Pythonマスターな方々に助けていただきたいです。

「Chapter2 変数と組み込み型」のあたり

文字列型とユニコード文字列型を分けていること
これは判りやすいですね。特に文字列の長さを判別する際に気をつける必要がある、と。内部での処理の際に文字列をどの文字コードで扱うかを最初に決めたほうがいいのでしょう。u”~”というリテラルで指定できることもあるので、ユニコードで統一したほうが扱いやすいのかな?
他の言語でいう配列にあたる(であろう)「リスト」が超便利
この辺はもう、特に単なるCとかから見れば「ありがたい!」と叫びたくなりますね。言語設計にオブジェクト指向がきちんと生きている、とでも言えばいいのか、やりたいことに対応するメソッドがきちんと整っている、という印象を受けます。なかでもスライスと、文字列とあわせて使うsplitとjoinあたり、ありがたいです。
「タプル」の使いどころを見極めたい
これは、実際に使っていない現時点ではありがたみがいまいちわかりませんが、まぁ今後の課題ということで。この本では、タプルの利点・使いどころとしては辞書(いわゆるHashtable)のキーに使えるよ、とありました。

「Chapter3 条件分岐とループ」のあたり

「Pythonと言えばインデント」?
if文の判定後処理部分などの範囲をインデントで判定する、というのは、言い換えれば「いやでもインデントされたソースが作られることになる」ということですよね。とても良い事だと思います。たまに「どっからどこまでがどうなんだ?」というようなソースを見ますからね…。おもしろい特徴だと思います。あ、でもセミコロンをつかえばそうでなくてもいいのかな?

「Chapter4 関数」のあたり

キーワード引数と引数のデフォルト値
このあたりが柔軟なのは実際に組む段階になったら便利だと思いますね。でも、キーワード引数に関しては、呼び出される関数の側であとから受け取る変数名を変えたいとなったら、逆に呼び出している部分のキーワード引数の部分の引数名をすべて変えなければいけなくなるのかな、と思うと、要は(キーワード引数に頼らずに)ちゃんと設計しておけ、ということですかね。

【8/24:とりあえずここまでとします】

【9/15:追加】

「chapter05 組み込み型を使いこなす」のあたり

しばらく時間があきましたが、再開します。

この章は「こういうメソッドなどをこのように使えばプログラムをよりスマートに組めます」といった感じのことが様々書かれています。まぁスマートだからいいのか、というとまたわかりませんが…

辞書キーを指定した埋め込み

いわゆるC言語などでいうsprintfに該当する文字列フォーマットがpythonにもあり、C言語などと同様に使えると共に、これに代入する変数が辞書に入っている際に、辞書キーを元に埋め込める、とのこと。

linkattrs = {"href":"http://host.to/path/",
"titie":"My Blog"}
formatstr = "<a href="%(href)s" title="%(title)s">%(title)s</a>"
atag = formatstr % linkattrs
print atag
<a href="http://host.to/path/" title="My Blog">My Blog</a>

これは辞書を使ったちょっとしたメッセージを場面に従って出力する際などに便利ですね。エラーメッセージなどこの典型でしょうか。エラーコード+メッセージ本文で辞書を作っておいてこの機能を使う、といったこととか。事前に分岐処理などが必要ないですし。ただ、大量処理の際に処理速度がどうなのかがちょっと気になりますので、使う場面は考える必要がありそうです。

リストのsort()メソッド

リストを通常以外の並び順にしたいときに、それ専用の関数を指定して並び順をコントロールできるとのこと。

set型

set型は内容の重複がないリスト、ということ。集合演算ができること。リスト同様のメソッドを使えるとのことですが、要素の取り出しが不便そうなので、集合演算を行いたい場合専用、なのでしょうか。

辞書のキーをスマートに使う

そのキーが辞書に存在するかは通常has_keyメソッドを使うので、文字列中の単語カウントを得る、ということをする際に、

for word in line.split():
if wordcount.has_key(word):
wordcount[word] = wordcount[word] + 1
else:
wordcount[word] = 1

となると。これはロジックそのままなので読みやすい。これが辞書のgetメソッドを使うと、キーに対応する値を得てかつキーがない場合にはデフォルト地を返せるということで、下のように書き換えられるとのこと。

for word in line.split():
wordcount[word] = wordcount.get(word,0) + 1

うーん、判ってしまえばこのほうが楽ですが、判るまではパッと見の可読性が落ちてしまうので、コメントでフォローですかね。「自分で書いてて後で読めなくなる」という典型のような書式ですが、もちろん悪いのはこうした書式自体でなく書くほうの記憶力ですよね。

でも、これだけ短く書けるのはそれはそれで魅力がありますね。「シンプルイズベスト」をどこでバランスをとるかでしょうか。

enumerate関数を使ったループ:

常、ループはfor文などを使いますが、ある一定の回数ではなくリストなどのシーケンスの要素数だけループさせる場合にはenumerate関数を使え、とのこと。enumerate関数が2つの要素を返す(一つ目が0から順番に増えていく数、2つめが引数のシーケンスで1つ目の数に該当するの要素)というわけですね。これはおそらく使用頻度が高いでしょう。

for cnt, item in enumerate(seq):
print cnt, item
関数から戻り値を複数返せる

これもなにげに便利ですね。リストで受け取り、かつ要素順でなくそのまま名前で参照できるとのこと。

minvalue, maxvalue, avarage = func()
def func()
....
return [minvalue, maxvalue, avarage]

ただし、返り値の数があっていないと例外が発生してしまうので注意。

日本語文字列について

日本語処理に関しては、ここでは文字コード変換に関してこと。日本語関連処理は日本語(≒マルチバイト文字)を利用する多くの処理で必要となるものなので、理解は必要でしょう。

ユニコードとマルチバイト文字列(Shift-JISやUTF-8など)を処理上明確にわけており、例えばchapter2であった、文字列の長さを得る組み込み関数len()の結果も、おなじ文字列に対してもユニコードかマルチバイト文字列かで結果が異なってくる、と。ユニコードのほうはいわゆる”文字数”、マルチバイト文字列の場合は、”バイト数”が返ってくる、といったイメージでしょうか。

なので、文字コード間の扱いの違いと相互のコード変換についての記述にスペースが割かれています。また、マルチバイト文字列→ユニコードへのエンコードなどで失敗した場合の対応がいくつか選べることは、場面によって判断を選べるので重宝しそうですね。データベースに格納する場合には厳しくは判断し、画面に表示する場合には多少の文字化けはOKとする、など。

【9/15:今日はここまでとします。もうちょっと更新頻度をあげたいです…】

広告

Python本買いました

以下の2冊の本を買いました。

みんなのPython 改訂版

みんなのPython 改訂版

みんなのPython Webアプリ編 [みんなのシリーズ]

みんなのPython Webアプリ編 [みんなのシリーズ]

実は昨年夏にもすこしGoogleAppEngineに手を出したことがあり、そのときによく参考にしていた本です。そのときは図書館で借りていたのですが、今回買ってしまいました。

こうしたプログラミング言語の本は、一度に内容のすべてを覚えることはできないので、結果何度も何度も開くことになります。なので、こういう本を買ったら、すぐに表のカバーをはずして、めくりやすいように何ヶ所にも開きグセをつけるようにしています…