2007-08-01から1ヶ月間の記事一覧

python-ogre

PythonMatrixJp: python-ogreの開発環境整備 for Windows (http://python.matrix.jp/projects/pyogre/install.html) PythonMatrixJp: カーシムを作ってみよう。 (http://python.matrix.jp/projects/pyogre/carsim.html) python-ogreは良さそう。少し勉強して…

小町算 (5)

組み合わせを作るところをflatten_for関数を使って書いてみた。 # 今までの方法 a = [['1']] for n in map(str, range(2, 10)): b = [] for s in a: for o in ['+', '-', '*', '/', '']: b.append(s + [o, n]) a = b # flatten_forを使った方法 ops = ['+', …

n次元ループを1次元ループに変換する (3)

どう書く?org: 全ての組み合わせ (http://ja.doukaku.org/comment/2358/) #2358をジェネレータに対応するように書き換えた。 import itertools def flatten_for(*args): D = dict([(id(L), L) for L in args]) def flatten_for_(*args): if not args: yield …

ジェネレータのコピー

自分で定義したジェネレータのインスタンスをコピーできない。 >>> import copy >>> def foo(): ... yield 1 ... yield 2 ... >>> copy.copy(foo()) ...(略)... TypeError: object.__new__(generator) is not safe, use generator.__new__() もちろん、f1 = …

n次元ループを1次元ループに変換する (2)

先日のflatten_forは、n次元ループを1次元ループに変換と考えたが、2つ以上のリスト(やイテレータ)を組み合わせて回す場合、以下の2通り存在する。 平行に組み合わせて回す (zipやenumerate) 階層的に組み合わせて回す (flatten_for) 2番目の階層的に組み合…

Short Coding本

今日購入して少し読んだ。内容はすばらしく、歴史に残る本だと思う。言語がCというのは一番ターゲット人口が多い言語だと思うので仕方がないが、他の言語にも応用できると思うのでPythonに応用しようと思う。 最近、仕事でグラフィックを描くライブラリが必…

デコレータ

@A @B @C(args) def f(): pass は、 _deco = C(args) f = A(B(_deco(f))) を意味する。

n次元ループを1次元ループに変換する

プログラミング日記: n回のループの一般形はどう書けるのか? (http://d.hatena.ne.jp/morchin/20070815#p1) 以前の日記の内容をまとめただけだが、以下のようになる。以下の flatten_for は、n次元ループを1次元ループに変換する汎用的な関数である。 from …

特異メソッド

jijixi's diary: 特異メソッドっぽいもの (http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20061231#p06) jijixi's diary: Python だって結構泥縄指向 (http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20061231#p05) Rubyの特異メソッドはきち…

無限リストの停止条件

>>> from itertools import * >>> # 通常こうする >>> for x in islice(count(), 3) ... print x 0 1 2 >>> # izipを利用する >>> for x,i in izip(count(), xrange(3)) ... print x 0 1 2 途中の要素をスライスする場合は使えないが、個数分取り出すときに…

ループのprev, curr, succの要素の取り出し

>>> from itertools import * >>> a = [1,2,3,4] >>> prevs = chain([None], a) >>> succs = chain(islice(a, 1, len(a)), [None]) >>> for prev,curr,succ in izip(prevs, a, succs): >>> print prev, curr, succ None 1 2 1 2 3 2 3 4 3 4 None Rubyだと結…

リストの範囲外の要素のアクセス

jijixi's diary: そのインデックスに要素が存在するかわからないときの書き方を考える (http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20070816#p02) 以下の方法を考えた。 # 1) EAFP try: [1,2,3,4][5] print 'ok' except: print 'ng' # 2) and,or…

accumulator

enbug diary: PythonでSICP (http://enbug.tdiary.net/20061208.html) なるほど。accumulateってこう書くのか。 # 繰り返し版 def accumulate(combiner, null_value, term, a, next, b): r = null_value while a <= b: r = combiner(r, term(a)) a = next(a)…

n回のループの一般形はどう書けるのか?

どう書く?org: 全ての組み合わせ (http://ja.doukaku.org/comment/2149/) 以下はoceanさんの解答にコメントを付けたものである。 def cross_product(*a): stack = [] def traverse(i): if i == len(a): # 再帰では、終了条件が必要 yield stack[:] else: for…

与えた条件を満たす候補

どう書く?org: 与えられた条件を満たす候補 (http://ja.doukaku.org/43/) Pythonでは演算子の優先順位が高い方から順に not x and y x or y のようになっているらしい。つまり、以下の式は True or False and False True or (False and False)と評価される。…

プレゼンツール

Pycairoを少し勉強した。Pycairoで簡単なプレゼンツールが作れないかと思っていたが、画像を作り出すというだけなので結局GUIライブラリも必要かもと思った。結局wxPythonになるかな。

オーシャンパシフィックピース (オッパッピー)

久しぶりのプログラミング以外のネタ。サンミュージックの小島よしおは最近知ったが、100年に1人の天才ではないかと思う。最近の若手お笑い芸人の中でダントツに面白い。すごいなあ。

サイクルを利用したFizzBuzz

そう言えばLL魂で FizzBuzz をサイクルを利用して作るみたいな話があったのを思い出したので実装してみた。 from itertools import cycle, count, islice, izip fiz = cycle(['', '', 'Fizz']) buz = cycle(['', '', '', '', 'Buzz']) cnt = count(1) for f,…

メソッドの継承

今日から『まるごとJavaScript & Ajax』という本でjavascriptを勉強し始めた。javascriptでメソッドを継承するという方法で、NFOアプローチと全く同様な実装が書かれていて、結構驚きだった。以下のような実装である。 function child(o) { function F() {} …

クラス vs 関数

記録: 最近クラスを使うことが減ってきている自分 (http://hiroshiykw.blogspot.com/2007/08/blog-post.html) このリンクの先についている「なぜオブジェクト指向は嫌われているのか」は面白いなあ。確かにクラスはJavaみたいに大げさにしすぎると使いづらい…

感想の感想

sshi.Continual: LL魂(LLSpirit)に行ってきましたよ (http://d.hatena.ne.jp/sshi/20070805/p1#seemore) 感想がすごい良くまとまっている。Pythonのところは細かいところだが少し気になった。 Pythonの「同じ機能は誰が書いても同じになる」って話を聞いた時…

LL魂に行ってきた

初めてプログラミング関係のイベントに参加した。来年は8月30日に中野ゼロホールで1300人で開催するらしく場所が地元だから来年も参加することにした。ただ時間が長くて座りっぱなしだったのでクーラーが結構辛かった。 内容はかなり面白く、普段ブログとか…

関数内のネストした名前空間

関数内のネストした名前空間で、外側の関数の変数の参照は可能だが、再結合は不可能。可変オブジェクトなら内容を書き換えるのに参照のみで再結合の必要ないので、内容を変更可能。しかし、intみたいに不変オブジェクトは参照は可能だが、再結合はできないの…

namespace function object (NFO) アプローチ

昨日のCAIAFは機能面での意味から名前を付けたが、少々長いし覚えづらい。 結局、 関数内のネストした関数の中で関数の外の変数(intなど)が再結合できない 関数の呼び出し側の階層で関数の中の変数が参照できない のを、 ダミーの関数の中に変数や関数などの…

str.startswith が遅い件

どう書く?org 実行時間の測定 (http://ja.doukaku.org/22/) デコレータに対応するようにして、時間計測。 import time def profile(func): def foo(*a, **k): t = time.time() r = func(*a, **k) print '%s: %g sec elapsed' % (func.__name__, time.time() …

commonly accessible instance attributes in function (CAIAF) テクニック

追記(2007/8/2): namespace function object (NFO) アプローチに改名。 今月25日に使ったテクニックに名前が付いていないので適当に付けた。どこかに付けている人がいそうだが、とりあえず自分の記憶用にメモ。クロージャと組み合わせると便利かも。もし、適…