Lightweight Language Lovers
PythonとRubyを比較してみる(Pythonによるコーディング)
システム部門で働いていると、テキストデータの受渡しが多いことでしょう。
最近はWEBが使ったシステムが多く、データの連携において機種依存文字や外字が含まれていないか
チェックが必要なケースが増えてきました。
以下はPython で書いていたチェックプログラムです。
シフトJIS(MS932)の文字列の中に、Windows固有の文字や外字が含まれないか調べることが目的です。
1 # -*- coding: cp932 -*-
2 """ Handle SJIS charcters"""
3 class SjisChars:
4
5 def __init__(self, s):
6 self.s = s
7
8 def check(self, d):
9 self.isKanji = ((0x81 <= d <= 0x9F) or (0xE0 <= d <= 0xFC))
10 self.isKisyu = (d in (0x87, 0xED, 0xEE, 0xFA, 0xFB, 0xFC))
11 self.isGaiji = (0xF0 <= d <= 0xF9)
12
13 def scan(self):
14 a = [c for c in self.s]
15 while a:
16 c = a.pop(0)
17 self.check(ord(c))
18 if self.isKanji:
19 c += a.pop(0)
20 yield c
21
22 if __name__ == '__main__':
23 sc = SjisChars("abcd漢字外字機種依存")
24 for c in sc.scan():
25 print c, sc.isKanji, sc.isKisyu, sc.isGaiji
check は漢字か否か等を判定するメソッド、scan は2バイト文字(漢字)を考慮して1バイトではなく1"文字"づつ返すメソッドです。
scan の説明ですが、まず14行目で文字列を1バイトで区切って配列に格納してから、1つ取り出してみて(pop)、漢字であれば次のバイトも取り出して += して返すことを繰り返します。(漢字の判定は手抜きして1バイト目だけで見ています。)
ここは別に配列への格納とpopなどしなくても素直に添え字を使ってアクセスすれば良い訳ですが、
添え字の加算等の操作は目的実現のための手段であってプログラムの本質ではありません。
LLの良さはこのように問題解決の本質とは関係ない記述を減らしてプログラムの見通しを良くできることにあると思います。
また、「ジェネレータは、イテレータを作成するための簡潔で強力なツールです。」 を使ってみました。Pythonだと理屈がいま一つ良く呑み込めなくても 簡単に高級な機能を使うことができてしまいます。
これをRubyで実装してみましょう。
と思いましたが
今あらためて見てみると、25行目は各文字は変数cに返ってきているのに、属性は親である文字列 sc を見にいっています。
とりあえず動くからいいのですが、あまり美しいとはいえません。
そこで、文字と文字列をきちんと分離してみることにしました。 --> /Python2へ