PIL
Pythonで画像処理をするときは PIL(Python Imaging Library)というのが使える。GD も ImageMagick も使えるが基本は PIL のように見える。
http://www.pythonware.com/products/pil/
200×200ドット背景黒の画像に1本白線を引くだけのプログラムは
import Image import ImageDraw im = Image.new('RGB', (200, 200), (0, 0, 0)) dr = ImageDraw.new(im) dr.line(((0,0), (100,100)), (255, 255, 255), 2) im.show()
という感じ。タプルが多数出現。im.show()の部分でローカル環境のビューワーが利用される。
利用できるモードは以下に、
1 | 1ビット 2値 白黒 1ピクセルは1バイトに |
L | 8ビット 256階調グレースケール |
P | 8ビット インデックスカラー |
RGB | 24ビットカラー |
RGBA | 32ビットアルファ付きカラー |
CMYK | 32ビットCMKY |
YCbCr | 24ビットビデオフォーマット |
I | 32ビット符号付整数 |
F | 32ビット浮動小数点 |
さらに限定サポートとして LA / RGBX / RGBa などが使える。
文字列は変更不可
Pythonの文字列は変更不可である。
>>> s = 'abcdef' >>> print s abcdef >>> print s[0] a
と部分文字列は参照できるが、代入しようとしても
>>> s[0] = 'A' Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> s[0] = 'A' TypeError: 'str' object does not support item assignment
↑のように怒られる。
irb(main):001:0> s = 'abcdef' => "abcdef" irb(main):002:0> s[0] = 'A' => "A" irb(main):003:0> p s "Abcdef" => nil
Rubyだと↑のように変更可能。
軽いのがタプル
タプルとリストの速度比較してみた。作って消すだけ。
タプル版
import datetime t1 = datetime.datetime.now() for i in range(1000000): a = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) del a t2 = datetime.datetime.now() print t2 - t1
リスト版
import datetime t1 = datetime.datetime.now() for i in range(1000000): a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] del a t2 = datetime.datetime.now() print t2 - t1
手元のWindowsマシンで前者が 1秒 後者が 2.391 秒。変更不可でメソッドを持たないということで軽量にしたのがタプルと理解。
バイナリデータを読む
ファイルに書かれた単精度実数(4バイトReal)を読む必要があったのでメモ。バイト並びはBig endian。structで処理すればいい。
import struct f = open('filename.bin', 'rb') dat = struct.unpack('>f', f.read(4)) print dat
こんな感じ。
struct の説明は↓にあった。
http://www.python.jp/doc/release/lib/module-struct.html
シングルクォーテーションとダブルクォーテーションの使いわけ
Python は言語仕様上文字列は'...'(シングルクォーテーション)と"..."(ダブルクォーテーション)のどちらでもいいようだ。
Perl / Ruby / PHP は二つの文字列を区別しててダブルクォーテーションの場合、文字列内の特殊文字や変数などを置換して、シングルクォーテーションの場合は置換をせずそのまま出力する。
Pythonの場合はどちらの場合もエスケープ文字を置換して出力する。置換しない場合は文字列の前にRAWの意味の r または R をつける。
>>> print 'abc\n123' abc 123 >>> print "abc\n123" abc 123 >>> print r'abc\n123' abc\n123 >>> print r"abc\n123" abc\n123
同じ処理ならどちらか片方に統一すればいいかと思うがライブラリ中でも両方が使われている。基本的にはダブルクォーテーションが多いようだ。
書式付き文字列変換
他の言語だとsprintf関数あたりで実装してる書式付き文字列変換がPythonは言語自体に入ってる。
http://www.python.jp/doc/release/lib/typesseq-strings.html
書式付き文字列 % 変数列が入ったタプル
で変換可能。
>>> '%s %d %2.1f' % ('hello', 38.6, 45.321) 'hello 38 45.3'
というようになる。タプルのところにリストを渡すと怒られる。ただし書式文字列のところに名前を指定すれば辞書を渡すことはできる。
>>> '%(str)s %(dec)d %(flt)2.1f' % {'str':'hello', 'dec':38.6, 'flt':45.321} 'hello 38 45.3'
色々と簡潔に書けそうな予感がして嬉しい機能だ。