ブログ引っ越し

引っ越しました。新ブログ → Blog :: Meatware

イースターエッグ

この記事は Python Tips Advent Calendar 2012 25日目の記事です。 最後は、クリスマスとキリストで繋がった、イースターエッグについてです。 Python に隠された卵を探して楽しみましょう。 The Zen of Python import this をすることで The Zen of Pytho…

正規表現あれこれ

この記事は Python Tips Advent Calendar 2012 24日目の記事です。 Python の正規表現には、便利な機能がいくつかあります。ということで、いくつか見ていきましょう。 コメント機能 >>> import re >>> re.compile(r''' ... ^ # start of a line ... \[fon…

シグネチャ確認

この記事は Python Tips Advent Calendar 2012 23日目の記事です。 dir 関数で、そのオブジェクトが持っているメソッドの一覧を出力できます。 >>> dir("foo") #doctest: +ELLIPSIS ['__add__', '__class__', ..., 'upper', 'zfill'] また、help 関数を使…

zlib, base64, rot13 エンコーディング

この記事は Python Tips Advent Calendar 2012 22日目の記事です。 Python でデータを圧縮したい時、通常は zlib モジュールを使ったりするかもしれませんが、特に特殊な指定を必要としないのであれば、encode 関数で事足ります。 >>> s = 'Hello World!!'…

yield の戻り値を受け取る

この記事は Python Tips Advent Calendar 2012 21日目の記事です。 yield の呼び出しには戻り値があります。 普段は None ですが、呼び出し元が send 関数を使った場合、その引数が yield の戻り値として渡されます。 >>> def f(xs): ... n = None ... for…

関数のデフォルト値の初期化タイミング

この記事は Python Tips Advent Calendar 2012 20日目の記事です。 Python の関数にはデフォルト値が付けられます。 このデフォルト値は、その関数を呼び出したタイミングではなく、その関数を定義したタイミングで初期化されます。 >>> def f(): ... prin…

unordered 系コンテナの max_load_factor 周りについて

C++

この記事は LL/ML Advent Calendar 19日目の記事です。 C++11 で追加された unordered 系のコンテナは、ハッシュを使って要素を管理するコンテナです。 そのハッシュを使ったアルゴリズムもいくつかありますが、C++11 では OpenHashing 方式を想定している…

組み込み関数を隠してしまった場合

この記事は Python Tips Advent Calendar 2012 19日目の記事です。 Python には何も import しなくても使える組み込み関数がありますが、これらと同名の変数を定義することができます。 >>> id # id 組み込み関数 <built-in function id> >>> id = 10 # 同名の変数を定義 >>> id </built-in>…

iterable を分ける

この記事は Python Tips Advent Calendar 2012 18日目の記事です。 Python の iterable オブジェクトから生成された iterator は一度しか走査できません。 >>> xs = iter([1,2,3]) >>> for x in xs: # xs の要素を全て消費 ... pass >>> # もう消費したオ…

iter に関数を渡す

この記事は Python Tips Advent Calendar 2012 17日目の記事です。 iter 関数は、iterable オブジェクトから iterator を取り出す関数です。 >>> xs = [1,2,3] >>> it = iter(xs) >>> it.next() 1 >>> it.next() 2 >>> it.next() 3 >>> it.next() #doctest…

roundの桁数指定

この記事は Python Tips Advent Calendar 2012 16日目の記事です。 round 関数は、指定した桁で四捨五入してくれます。 >>> round(1234.5678, 2) 1234.57 実はこの値、マイナス値も指定できます。 >>> round(1234.5678, -2) 1200.0 マイナス値を指定すると…

データのフラット化

この記事は Python Tips Advent Calendar 2012 15日目の記事です。 2次元のデータを1次元のデータにしてしまいたいときがあります。その場合、リストに対しては以下のように書けます。 >>> xss = [[1, 2], [3], [4, 5, 6]] >>> sum(xss, []) [1, 2, 3, 4…

2次元データの縦と横を入れ替える

この記事は Python Tips Advent Calendar 2012 14日目の記事です。 Python では、2次元配列などのデータに対して縦と横を入れ替える(transpose)が簡単にできます。 zip を使うだけです。 >>> xss = [[1, 2, 3], ... [4, 5, 6], ... [7, 8, 9]] >>> zip(…

バッククォートでrepr

この記事は Python Tips Advent Calendar 2012 13日目の記事です。 Python2 だけですが、バッククォートは repr 関数と同じ意味になります。 >>> e = Exception('foo') >>> repr(e) "Exception('foo',)" >>> `e` "Exception('foo',)" ただし、Python2 だけ…

リストやタプルの unpack

この記事は Python Tips Advent Calendar 2012 12日目の記事です。 Python のリストやタプルは、展開した上で代入といったことができます。 >>> a, (b, c), d = [(1, 2), (3, 4), (5, 6)] >>> print a (1, 2) >>> print b 3 >>> print c 4 >>> print d (5,…

文字列のフォーマット出力

この記事は Python Tips Advent Calendar 2012 11日目の記事です。 Python のフォーマット出力は何種類かあります。 >>> print "The %s is %d." % ('answer', 42) The answer is 42. タプルによるフォーマット出力です。名前が指定できず、型指定が必要で…

filter, map に指定する関数

この記事は Python Tips Advent Calendar 2012 10日目の記事です。 通常、filter, map の第一引数には関数(callable なオブジェクト)を指定しますが、これは None であっても構いません。 None を指定した場合、lambda x: x と大体同じ意味になります*1…

内包表記いろいろ

この記事は Python Tips Advent Calendar 2012 9日目の記事です。 まず、list, set, dict は、それらを生成するための専用の構文を持っています。 >>> [1,2,3] # リスト生成 [1, 2, 3] >>> {1,2,3} # 集合生成 set([1, 2, 3]) >>> {1:1,2:2,3:3} # 辞書生成…

再 raise

この記事は Python Tips Advent Calendar 2012 8日目の記事です。 Python で受けた例外をそのまま上に伝える場合、単に raise と書くだけで伝えられます。 >>> try: #doctest: +ELLIPSIS ... raise Exception, 'error' ... except Exception, e: ... if e.m…

for-else, try-else 構文

この記事は Python Tips Advent Calendar 2012 7日目の記事です。 Python の for や try 文では、else 節を含めることができます。 >>> def find(xs, v): ... for x in xs: ... if x == v: ... print 'found' ... break ... else: ... print 'not found' >>…

外部変数のキャプチャ

この記事は Python Tips Advent Calendar 2012 6日目の記事です。 Python では、ラムダ式やローカルでの def 関数は、それらを定義した時に、外にあるローカル変数の参照を、ラムダ式や関数のオブジェクトの内部に保存します。 >>> x = 10 >>> f = lambda: …

print で標準出力以外に出力する

この記事は Python Tips Advent Calendar 2012 5日目の記事です。 ※以下の説明は Python 2 用です。Python 3 では print(..., file=sys.stderr) などになります。 print 関数はデフォルトでは標準出力に出力しますが、明示的に指定すればそれ以外の場所、標…

暗黙bool値変換

この記事は Python Tips Advent Calendar 2012 4日目の記事です。 Python はいろんな値を、暗黙に bool 値として扱います。 False として扱われるデータは以下の通りです。 >>> false = False >>> none = None >>> int_zero = 0 >>> long_zero = 0L >>> flo…

スライス操作あれこれ

この記事は Python Tips Advent Calendar 2012 3日目の記事です。 今日は Python のスライス操作についてです。 基本的なスライス操作 >>> xs = range(10) >>> xs[2:5] # 2以上5未満までのインデックス [2, 3, 4] >>> xs[:2] # 前を省略した場合は0と同じ […

文字列を複数行に書く

この記事は Python Tips Advent Calendar 2012 2日目の記事です。 >>> "aaa\ ... bbb" 'aaabbb' \ で終わると単純に結合してくれるので、このようになります。 >>> '''aaa ... bbb''' 'aaa\nbbb' """ や ''' で囲まれた文字列は、改行コードもそのまま入っ…

比較の連鎖

この記事は Python Tips Advent Calendar 2012 1日目の記事です。Python では比較を連鎖させていくことができます。 >>> x = 5 >>> 0 <= x <= 10 True これは、ほぼ 0 http://docs.python.jp/2/reference/expressions.html#comparison .

os.pipe を使って subprocess.Popen する時の注意

ファイルディスクリプタは subprocess.Popen (というか fork)時にコピーされます。 なので、親プロセスと子プロセスの両方で、必要のないディスクリプタを閉じる必要があります。 しかしこれ、子プロセスが既存のコマンド(例えば tail)だったらファイル…

shrink-to-fit の幻想

C++

C++03 には shrink-to-fit というイディオムがあります。 More C++ Idioms/縮めて合わせる(Shrink-to-fit) - Wikibooks std::vector<int> v; //... たくさんの push_back と、たくさんの v に対する削除 //その結果、v のサイズは小さいが、容量は大きい。 std::v</int>…

try-and-back-off アルゴリズム

C++

C++11 には、複数の Lockable なオブジェクトをロックしてくれる std::lock 関数があります。 template<class L1, class L2, class... L3> void lock(L1& m1, L2& m2, L3&... m3); この関数の最大の特徴は、決してデッドロックしないことです。 そして、このデッドロックしないという要件を満</class>…