印度式九九(11~19)をクラスを使ったワンライナーで(その2)

[pukiwiki]
[[昨日のコード:http://boxheadroom.com/2008/02/11/%e3%82%a4%e3%83%b3%e3%83%89%e5%bc%8f%e8%a8%88%e7%ae%97%e3%82%92python%e3%81%a7%e7%b7%b4%e7%bf%92-%e4%bb%96]]は読みにくかったので、リスト内包記法がネストしないように書き直してみました。以下 チラシの裏
[/pukiwiki]

リストにメソッドを追加するのに、組込関数typeを使ってクラスを作成しています。class文を使うと一行に書けないので。


import random,sys;f=lambda x=None:random.randint(11,19);pr=sys.stdout.write;c=type("MyList",(list,),dict(__new__=lambda cls,*x : list.__new__(cls),__init__=lambda self,*x:self.extend(x),apply=lambda self,f : f(*(self))));L= [c(f(),f()).apply(lambda x,y:c(x,y,int(input("%s*%s =?" % (x,y))),x*y)).apply(lambda x,y,q,a:pr("%s*%s=%s,your answer=%s,%s\\n"%(x,y,a,q,(a==q)))) for i in xrange(3)]

自分でも、もう一度同じもの書け、って言われても困るのでメモしておきます~
普通に書くと
[pukiwiki]
_from random import randint
_class MyList(list):
_ def __new__(cls,*x):
_ list.__new__(cls)
_ def __init__(self,*x):
_ self.extend(x)
_ def apply(self,f):
_ f(*self)
_for i in xrange(3):
_ x=randint(11,19)
_ y=randint(11,19)
_ q=input(“%s*%s=”%(x,y))
_ print “%s*%s=%s your answer=%s %s”%(x,y,q,x*y,q==x*y)

上の一行のに適宜改行を入れると(改行を入れちゃうと、対話環境じゃ、うまく動かんのですが。ファイルに保存すれば動きます)

_import random,sys
_f=lambda x=None:random.randint(11,19)
_pr=sys.stdout.write
_c=type(“MyList”,(list,),
_ dict(
_ __new__=lambda cls,*x : list.__new__(cls),
_ __init__=lambda self,*x:self.extend(x),
_ apply=lambda self,f : f(*(self)))
_ );
_L= [c(f(),f())
_ .apply(
_ lambda x,y:
_ c(x,y,int(input(“%s*%s =?” % (x,y))),x*y)
_ )
_ .apply(
_ lambda x,y,q,a:
_ pr(“%s*%s=%s,your-answer=%s,%s%s”
_ % (x,y,a,q,(a==q),chr(0x0a)))
_ )
_ for i in xrange(3)]
かなり普通っぽく。
[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。