Guidoのメモ書きのメモ書き。(6章〜最終章まで。ほか)
format strings は vars() を使うと楽。
>>> spam = "SPAM!"
>>> egg = "EGG!!"
>>> bacon = "BACON!!!"
>>> "%(spam)s, %(egg)s, %(bacon)s" % vars()
'SPAM!, EGG!!, BACON!!!'
ファイルライクオブジェクトは、そのままループにかけられる。
>>> from StringIO import StringIO
>>> s
'SPAM!\nEGG!!\nBACON!!!'
>>> s = StringIO(s)
>>> for i in s:
... print i
...
SPAM!
EGG!!
BACON!!!
例外はインスタンス化して送出する(されている)。
import os と書くのは、os.open が built-in の open を上書きしないようにするため。
対話モードのインタプリタを起動するときに PYTHONSTARTUP に指定されたファイルが実行される。
module を生成する。
>>> d = dict()
>>> exec "x = 1" in d
>>> import imp
>>> imp.new_module("foo")
<module 'foo' (built-in)>
>>> foo = _
>>> foo.__dict__.update(d)
>>> foo.x
1
Via nishio.
リストの範囲外を取得する。
>>> l = range(4)
>>> dict(enumerate(l)).get(4, "nothing")
'nothing'
Via http://d.hatena.ne.jp/morchin/20070914#p1
generator をコピーしたら元の generator を操作してはいけない。
>>> import itertools
>>> def foo():
... yield 1
... yield 2
...
>>> f = foo()
>>> f1, f2 = itertools.tee(f)
>>> f.next()
1
>>> f1.next()
2
>>> f2.next()
2
>>> f.next()
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in ?
StopIteration
Via [Python] ジェネレータのコピー http://d.hatena.ne.jp/morchin/20070829#p1
逆ポーランド記法
def _calc(calc):
def func(string):
if " " in string:
string = string.split()
filter(calc, string)
return func
@_calc
def calc(val, stack=list()):
if val == "=":
print " result %d" % stack.pop()
else:
func = {
"+": lambda x, y: y + x,
"-": lambda x, y: y - x,
"*": lambda x, y: y * x,
"/": lambda x, y: y / x,
}.get(val)
if func:
val = func(stack.pop(), stack.pop())
stack.append(int(val))
print stack
if __name__ == "__main__":
calc("53+2*4-3/=")
calc("12+34+*=")
calc("0 53 + 2 * 4 - 3 / =")
calc("0 12 + 3 4 + * =")
