Re:Re:PythonでRubyのeach_with_indexみたいなもの

30分プログラム、その544。PythonRubyのeach_with_indexみたいなもの。
kyeeva blog!を読んで、そういえばRuby1.9から

[1,2,3].each.with_index do|x,i|
  p x,i
end

って書けるようになったんだよなぁ、と思ったのでやってみた。

最終的に、

for (x,i) in lst(['a','b','c']).each().with_index():
  print x,i

と書けるようになったし、良しとしよう。

使い方

# 普通にループする(each()はなくてもいい)
for x in lst(['a','b','c']).each():
  print x

# インデックスを付けてから、逆順にする
for (x,i) in lst(['a','b','c']).each().with_index().reverse():
  print x,i

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# with_index.py -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/03/13 22:28:32
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

# generator wrapper
class Enumerator():
    def __init__(self,generator):
        self.generator = generator

    def each(self):
        return self

    def with_index(self):
        def f():
            i = 0
            for x in self.generator:
                yield (x,i)
                i += 1
        return Enumerator(f())

    def reverse(self):
        xs = list(self)
        xs.reverse()
        return Enumerator(xs.__iter__())


    # for iteration
    def __iter__(self):
        return self.generator

def lst(xs):
    return Enumerator(xs.__iter__())

if __name__ == '__main__':
    # I want to run following code
    for x in lst(['a','b','c']).each():
        print x
    for (x,i) in lst(['a','b','c']).each().with_index().reverse():
        print x,i