methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

勝手に添削 (C vs Python vs Ruby vs Haskell(ナンバリングdeベンチマーク))

C vs Python vs Ruby vs Haskell(ナンバリングdeベンチマーク) を勝手に添削。

今回は話題的に最適化するにはバイトIOにするとか出てきて面倒なので省略して、 Pythonic にするだけ。

元のコードは

import sys

argvs = sys.argv
del argvs[0]
for i in range(len(argvs)):
	print(argvs[i])
	fin = open(argvs[i], 'r')
	a = 0
	for line in fin:
		a += 1
		print(a, line, end = '')
	print("\n")
	fin.close()

これを Pythonic にしていきます。

  1. Linuxでは open() が utf-8 でファイルを開くので、とりあえず青空文庫のテキストファイルに合わせて 'cp932' を指定.
  2. 本体部分は関数の中に書く
  3. sys.argv を直接編集するのをやめる
  4. enumerate を使う
  5. with を使う
import sys

def print_with_number(files):
    for filename in files:
        print(filename)
        with open(filename, 'r', encoding='cp932') as fin:
            for lineno, line in enumerate(fin, 1):
                print(lineno, line, end = '')
        print("\n")

if __name__ == '__main__':
    print_with_number(sys.argv[1:])