『Ruby - Wikipediaの例をPythonでやってみた−前半戦 - 牌語備忘録 - pygo』の続き
Ruby - Wikipediaの例をPythonでやってみた−後半戦
クロージャ
クロージャとなるようなブロックの引数渡し?
def remember(proc): def block(name): return proc(name) return block a = remember(lambda name:"Hello, %s!" % name) print a('John') print a('George') b = remember(lambda name:"Howdy, %s!" % name) print b('Paul') print b('Ringo')
実行結果
Hello, John! Hello, George! Howdy, Paul! Howdy, Ringo!
その1
def create_set_and_get(value = [0]): def proc1(x): value[0] = x def proc2(): return value[0] return proc1, proc2 setter, getter = create_set_and_get() setter(21) print getter() #21
その2(ラムダ版)
def create_set_and_get(value = [0]): return lambda x:value.insert(0, x), lambda :value[0] setter, getter = create_set_and_get() setter(21) print getter() #21
クロージャこれであってる?(´・ω・`)
クラス
class Person: def __init__(self, name, age): self.name = name self.age = age def __cmp__(self, person): return cmp(self.age, person.age) def __str__(self): return "%s (%d)" % (self.name, self.age) group = [Person("John", 20), Person("Markus", 63), Person("Ash", 16) ] g = sorted(group, reverse = True) print "\n".join(["%s" % s for s in g])
実行結果
Markus (63) John (20) Ash (16)
リストを表示すると
>>> group [<__main__.Person instance at 0x787f80>, <__main__.Person instance at 0x787fa8>, <__main__.Person instance at 0x787fd0>]
となり、見づらいから__getattr__を追加してみた。
class Person: def __init__(self, name, age): self.name = name self.age = age def __cmp__(self, person): return cmp(self.age, person.age) def __str__(self): return "%s (%d)" % (self.name, self.age) def __getattr__(self, name): return getattr(self.__str__(), name) group = [Person("John", 20), Person("Markus", 63), Person("Ash", 16) ] print group g = sorted(group, reverse = True) print "\n".join(["%s" % s for s in g])
実行結果
['John (20)', 'Markus (63)', 'Ash (16)'] Markus (63) John (20) Ash (16)
ちなみにRubyのattr_readerは何なのか解らなかった(´・ω・`)
例外処理
#(raiseで例外を強制的に送出) try: # 通常処理 raise NameError, "Hogera?" except NameError: # 例外処理 print "Fugeraccho!" raise finally: # 例外の発生に関わらず処理 print "Done!"
実行結果
Fogeraccho! Done! Traceback (most recent call last): File "/tmp/py495Lku", line 2, in <module> raise NameError, "Hogera?" NameError: Hogera?
おしまい