はじめての Python

所用で名古屋まで出かけたついでに大きな書店によって適当に技術書をあさったり。
で、タイトルがひどい*1とうわさの紫藤さんの「はじめてのPython」をぱらぱらとめくってみたんだけど、まあ予想通りというかなんというか。あまりにあれだからレジまで運んじゃったよ。
例えば reduce はこんな実装ですよ、と紹介されている。

def reduce(f, seq, init=None):
    val=init or seq[0]
    for item in (seq if init else seq[1:]):
        val=f(val, item)
    return val

それ、init に 0 やら空文字やらを指定できないし seq にイテレータを指定できないじゃねーかと。他のところでもやたらと val=foo or default とやってるんだけど、こうやってはまるくらいなら止めておいたほうが良い。
でまぁ、まじめに書くならこんな感じかなぁ。

dummy = object()
def reduce(f, seq, init = dummy):
    it = iter(seq)

    if init is not dummy:
        val = init
    else:
        try:
           val = it.next()
        except StopIteration:
           raise TypeError('reduce() of empty sequence with no initial value')

    for x in it:
        val = f(val, x)

    return val

ちくちくあげると、

  • 「値を返さない」と「Noneを返す」を区別していない(Python ではすべての式は値を持つ)
  • PythonRubyPHP が「動的に強い型付けされた言語」(PHP の型は弱いだろ)
  • 末尾再帰の説明がひどくおかしい
  • 相変わらず UnboundLocalError の意味が分かっていない

あと、true_value if condition else false_value を「3項演算子」と紹介するのはいかがなものかと。ちゃんと conditional expression という名前がついているんだけどな。

*1:「初めてのPython」という本と非常にまぎらわしい