「ふと、手続き型言語だとちょっと大変かな?と思ったプログラム」のプログラムをPythonとRubyで書いてみた

少し前にふと、手続き型言語だとちょっと大変かな?と思ったプログラム - しんちゃんの日記でファイルの内容を全部逆にしてナンバリングするのは関数型言語では簡単だったのだけど、手続き型言語ではちょっと大変なのでは?と書いたわけですが、本当かどうかPythonで検証してみた。
>|python|

import sys

for arg in sys.argv[1:]:
print(arg)
fin = open(arg, 'r')
a = 1
s = ""
for line in fin:
s += line
s = list(s)
s.reverse()
print('',a,end = '')
for i in s:
if i == '\n':
a += 1
print(i,a,end = '')
else:
print(i,end = '')
print("\n")
fin.close()

<
import sys

for arg in sys.argv[1:]:
 print(arg)
 content = open(arg).read()[::-1]
 for no,line in enumerate(content.split('\n'),1):
  print(str(no)+line)
 print()

文字列から改行文字で分割して文字列のリストを作る関数なりメソッドなりが有ればもうちょっと簡単になるんだろうけど、私はPythonに詳しくないので知らない!(ドヤッ)
Rubyはもっと知らない!(ドヤドヤァッ)
仮に知ってても、やっぱり関数型言語よりは面倒臭い事には変わりない気がする。
そうは言っても、PythonRubyに詳しい人からすれば「そんな事あるか!関数型言語にだって負けないくらい簡単に書けるわ!!」と言う意見も有るかも知れない。

通りすがりさんから、コードを提供頂いたので、更新しておきました。
コメント欄に、Haskell風のPythonコードもあるので、そちらも見てもらうと、その柔軟さが見て取れます。
Haskellのコードも頂いたのですが、どちらの方が良いのか判断付きかねたので(いや、基本的に通りすがりさんのコードの方が良いと思うのですが)、一応そのままにしておきます。
興味がある方は、これもコメント欄の通りすがりさんのコードを参照願います。

何はともあれ、ここに再度Haskellのコードも掲載しておきます。

import System.Environment

numbering = unlines.(map (\(x,y) -> show x ++ y)).(zip [1..]).lines

main = getArgs >>= \args -> mapM readFile args >>=  return.map (numbering.reverse) >>= 
			(mapM_ (\(x,y) -> putStrLn $ x ++ "\n" ++ y)).zip args


C vs Python vs Ruby vs Haskell(ナンバリングdeベンチマーク) - しんちゃんの日記の普通のナンバリングのコードと比べて、Pythonは大分変っているのに、Haskellは少しの変更で機能を実現しているのにも注目です。

2012年11月24日22:02追記

Rubyでも書いてみました。
>|ruby|
ARGV.each do|fname|
puts fname
i = 0
s = ""
File.open(fname).each{|line|s += line }.close
s.reverse.split("\n").each{|line| print i += 1, line, "\n" }
puts "\n" * 2
end

<
ARGV.each do |arg|
    puts arg
    content = File.read(arg).reverse
    content.each_line.with_index(1) do |line, no|
        puts no.to_s + line
    end
    puts
end

Pythonでは文字列型にreverseが付いてないのですが、Rubyには付いてますね・・・。
Pythonでは、一旦リスト型に変換して、また文字列型に戻すと同様な処理になりますが、行数では上のコードよりも長くなってしまいます。
それでも、RubyHaskellよりはコードの変更箇所が多いみたいですね。

2012年12月2日追記

TooさんよりRubyのコードを頂きましたので、置き換えました。