関数型と手続き型

フローチャートの記事と関数型プログラミングの記事が同時期に出てくるとは。
しかし、

羽生氏は講演を「抽象化能力を極限まで高めるにはフローチャート程度がちょうどいい」と締めくくった。

フローチャートのどこが抽象化なのかと。あんなもん、コードの制御構造を可視化しているだけじゃないか。
ついでにいえば、Pythoniterator/generatorを使ったり、Javaで拡張for構文を使ったりしている身としてはフローチャートで繰り返しを分岐で書くとか有り得ん。それって、for 文を禁止するようなもんだよなぁ。どのへんが抽象化だよ。
まぁ、新人教育の初期ならいいのかなぁ。関数型を排除した手続き型パラダイム限定で。企業なら大抵関数型のプログラミングとかしにくい言語が多いだろうから問題ないか。

Pythonでn-gramの頻度計算

1年以上前のエントリにTrackback打つのもアレだけどまあいいや。最近 Python にはまっているので練習がてら。
とりあえず意味もなく徹底的に generator 式を多用してみた。おかげでほとんどループがない。あと、コメントアウトを解除すると文字bigramから単語bigramに変わる。単語の分割が超適当だけど。

import locale
import fileinput
import itertools
import sys
import re

def iterngrams(s, n=2):
    return (s[i:i+n] for i in xrange(len(s) - n + 1))

def counts(seq):
    res = {}
    for s in seq:
	res[s] = res.get(s, 0) + 1
    return res

sep = re.compile(ur'\s+')
enc = locale.getpreferredencoding()
inputs = (line.rstrip().decode(enc) for line in fileinput.input())
#inputs = (tuple(sep.split(line)) for line in inputs)
ngrams = itertools.chain(*(iterngrams(line, 2) for line in inputs))
items = counts(ngrams).items()
items.sort(lambda x, y: cmp((y[1], x[0]), (x[1], y[0])))
for key, val in items:
    sys.stdout.write(("%s\t%s\n" % (key, val)).encode(enc))