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'

色々と簡潔に書けそうな予感がして嬉しい機能だ。