[Python]: Python チュートリアル メモ2

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 + * =")

http://MiCHiLU.com/blog/posts/125/

  • Added at Fri, 2 Nov 2007 03:01:11 +0900
  • Last modified at Fri, 2 Nov 2007 03:02:36 +0900

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License. http://creativecommons.org/licenses/by-nc-sa/2.1/jp/

author:
Posted on
Updated on