Pythonクックブックを読んでいる(1)
2009年2月7日
Pythonプロジェクトもいくつか片付けて、
そろそろ復習しとくと効果的だなということで、
会社の本棚にあった「Python クックブック」を読み始めました。
主に、「あー、これこれ、どう書くのかと思ってたよ!!」
・・・的な、自分が不便に感じたことのある内容を拾って読んでます。
1. 文字列を文字の配列に変換する
>>> list("abc") ['a', 'b', 'c']
JS的に “abc”.split() でやろうとしたらエラーになっちゃったので、どう書くのかと思ってた。
まさかの灯台元暗し。
2. “プレーン文字列”と”Unicode文字列”
単なる用語の話ですが、今まで str と ustr を口頭で区別して話すときに、
str の方を「ただの/単なる/普通の 文字列」とか言ってて不便だった。
3. 正統な文字列型チェック
本によると正解はこれだということ。
def isAString(anobj): return isinstance(anobj, basestring)
こんな風に書いちゃうとstr継承クラスを判別できないでしょお、ということです。
type(anobj) == type("")
過剰に気をつける必要も無い気がするけど、
色々やり方があってどれか困ってたので、今後はこれにします。
4. テキスト幅寄せ
>>> "1234".center(10) ' 1234 ' >>> "1234".ljust(10) '1234 ' >>> "1234".rjust(10) ' 1234'
面白いなー、使いどころは今のところ思いつかないけども。
5. スペース/タブ/改行文字等のトリム
今まで正規表現でやってたけど、
良くある論点なので、特別な関数を覚えてもいいと思ってた。
>>> " \t\r\naaa\nbbb\t\r\n ".lstrip() 'aaa\nbbb\t\r\n ' >>> " \t\r\naaa\nbbb\t\r\n ".rstrip() ' \t\r\naaa\nbbb'
6. 文字列フォーマットの方が文字列連結よりいいかもね
Pythonの文字列は、修正する度に新しい文字列を生成するので
"My name is " + "taro" + ", " + "15" + " years old."
という処理だと、途中で
“My name is taro”
“My name is taro, “
“My name is taro, 15”
という文字列を作っては破棄することになるそうだ。
なので、上記より下記のように書いた方が早いよ、ということです。
"My name is %s, %s years old." % ("taro", "15")
ただ、最近だとインタプリタがその辺を吸収してくれたりするので、
どこまで効果が出るかは不明。
まー、可読性重視でも文字列フォーマットを使うので、問題無し!
7. 文字列の反転
>>> "abcde"[::-1] 'edcba'
加えて、スライスに3つ目の引数が存在することと、
それを「拡張スライシング指示子」と呼ぶことを知った。
8. translate
文字列をフィルタリングしたりフォーマットしたりするのに、
「素晴らしく強力でフレキシブル」かつ「高速」であるらしい。
しかし、仕様が特殊で複雑であるのと、
使い易くしたということで本に載っているラッパ関数の中のまたその中にも
あんまり使わない関数が入ってたりするので、ちょっと微妙。
大量のテキストを捌く時には使えるかも、という所で保留。
9. “クロージャファクトリ”
クロージャを返す関数を、今まで「クロージャを返す関数」(そのままだ)
と呼んでたんですが、「クロージャファクトリ」って言っていいらしい。
10. バイナリ列が文字列かを判定する
詳しく読んでないですが、サンプルが載ってた。
ソケットサーバを作るときとかに使えそう。
11. 結合メソッド(Bound Methods)
>>> L = ['fee', 'fie', 'foo'] >>> x = L.append >>> x('fum') >>> L ['fee', 'fie', 'foo', 'fum']
この x のことを、結合メソッドというらしい。
ちなみに、こういう書き方も可能で
>>> L = ['fee', 'fie', 'foo'] >>> x = list.append >>> x(L, 'fum') # 第1引数でスコープを決められる >>> L ['fee', 'fie', 'foo', 'fum']
こっちの x は、非結合メソッドというらしい。
へー、と思ったけど、使いどころは不明。
12. str と ustr の連結は必ずustrになる
・・・んだそうな。今まで無駄にunicode関数とかを掛けてたかも。
13. import this
>>> import this The Zen of Python, by Tim Peters (... 以下略)
いつもがいつもなので、最後まで読めるとは到底思えないんだけど、
この本ならK点越えは目指せそう、かも。