日別アーカイブ: 12月 23, 2007

Pythonで偶然、変なプログラム書いた

[pukiwiki]
*今年最後のWBS土曜版
塩田さんがフワフワのモコモコ&ブーツ~
2週間のお別れです~~ぐすん。
*[[10年経って心臓が再び動き出した少女!(イギリス):http://boxheadroom.com/2006/04/14/girl_heart]]
たまたまテレビを付けたら、ドラマでピギーバック移植のシーンが有りました。
*[[Python からCOMコンポーネントを使って、Microsoft Excelのファイルを読み込む:http://shisashi.blogspot.com/2007/12/python-commicrosoft-excel.html]]
*[[Python Win32 Automation – 傀儡師の館 :http://b.hatena.ne.jp/entry/4733987]]
いま、楽天がメンテ中なので、あとで読む
*[[子供でもできる Python:http://b.hatena.ne.jp/entry/6208576]]
*[[UniDic ってなんだ (Python で人工無能):http://b.hatena.ne.jp/entry/6873552]]

*[[BeautifulSoupで株価をゴリゴリ:http://shisashi.blogspot.com/2007/12/python-commicrosoft-excel.html]]
*ジェネレータ+デフォルト引数=イテレータ?
[/pukiwiki]

寝ぼけてたら、偶然、こんな感じのコードを書いてしまったのでメモ。

class Test :
    def __init__(self):
        self.g=(x for x in xrange(1,10))
    def next(self):
        for i in self.g:
            return i
test=Test()
t=1
while t:
    t=test.next()
    print raw_input(t)

太字が偶然な部分。forループからreturnするたび、数字がカウントアップするという。。。
これって、多分、間違った書きかたかと思われ。。。いや、希望通りに動いてるけどorz
ちゃんとしたイテレータの書き方のチュートリアル探さなくちゃ。。。

もう少しシンプルに書き直してみた

from glob import iglob #globのジェネレータ版
def next(g=iglob("*.jpg")):
    for x in g :
        return x
    #raise Exception
while 1 : print raw_input(next()) 

-next()を呼ぶたびにカレントディレクトリのjpegファイル名を一個返します。
-終端に来るとNoneを返す
-例外を発生させてもOK

最初、変態~と思ったけど、慣れたら気持ちよくなってきた(汗

イベントドリブンなプログラムで便利です。
いや、ホントは、ちゃんとしたイテレータ書けばいいんですけど(汗
[pukiwiki]
*こんなの書かなくても
<<追記>> 2008-01-01
ジェネレータ.next()でいけた。 

_>>> g=(x for x in [1,2,3])
_>>> g.next() ;g.next() ;g.next();g.next()
_1
_2
_3
_Traceback (most recent call last):
_ File ““, line 1, in
_ g.next() ;g.next() ;g.next();g.next()
_StopIteration

この記事書いたときにも同様なコードを試したけど、うまくいかないような気がしたのだけれど、それは勘違いだったみたいです。
[/pukiwiki]