牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Ruby - Wikipediaの例をPythonでやってみた−後半戦[完結]

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?


おしまい