PythonのTips忘却録2

改行なしで出力したい

printの最後に,をすれば改行されない。

% python
>>> hoge = "こんにちわ"
>>> foo = "改行なし"
>>> piyo = "piyopiyo"
>>> if 1:
...     print hoge,
...     print foo,
...     print piyo,
...     print hoge,foo,piyo
...     print hoge,foo,piyo
... 
こんにちわ 改行なし piyopiyo こんにちわ 改行なし piyopiyo
こんにちわ 改行なし piyopiyo

複数比較を行う

CとかJavaでは通常複数比較は以下のように書く

if( x == 1 || x == 2 || x == 3)

Pythonでは||はorだから

if x == 1 or x == 2 or x == 3 :

と書けるけど、これはPythonicではない。Pythonではinを使って表現

if x in (1, 2, 3)

うつくしす

switch文

Pythonにはswitch文がありません。なのでif 〜 elif 〜 else で代用します。
C言語では以下のように書くのを

switch(flag) {
case 1: printf("case 1\n");
        break;
case 2: printf("case 2\n");
        break;
case 3: printf("case 3\n");
        break;
default: printf("default\n");

Pythonでは以下のように書く

flag = 3;

if flag == 1:
>-print "case 1"
elif flag == 2 :
>-print "case 2"
elif flag == 3 :
>-print "case 3"
else:
>-print "default"

Pythonの文字列フォーマット、いわゆるPerlのヒアドキュメントを実現

テンプレート処理などができますね

% python
>>> doc = '''こんなに長い分もPython(%(python)s)では関係なく置き換えられます。
... まさにC言語(%(c)s)のPrintfですね。
... %(okikae)s 挿入した言葉
... %(suuji)d 数字もOK
... '''
>>> word = {'python' : 'パイソン', 'c' : 'しーげんご', 'okikae' : 'ここにいれます', 'suuji' : 10}
 print doc % word
こんなに長い分もPython(パイソン)では関係なく置き換えられます。
まさにC言語(しーげんご)のPrintfですね。
ここにいれます 挿入した言葉
10 数字もOK
>>> 

そのモジュールで利用できるオブジェクト、変数、メソッドを調べる

xxx.__all__を使えばよい

% python
>>> import csv
>>> csv.__all__
['QUOTE_MINIMAL', 'QUOTE_ALL', 'QUOTE_NONNUMERIC', 'QUOTE_NONE', 'Error', 'Dialect', 'excel', 'excel_tab', 'reader', 'writer', 'register_dialect', 'get_dialect', 'list_dialects', 'Sniffer', 'unregister_dialect', '__version__', 'DictReader', 'DictWriter']
>>>
インスタンスオブジェクトのアトリビュート一覧を取り出す

dir()を利用する

>>> import csv
>>> dir(csv)
['Dialect', 'DictReader', 'DictWriter', 'Error', 'QUOTE_ALL', 'QUOTE_MINIMAL', 'QUOTE_NONE', 'QUOTE_NONNUMERIC', 'Sniffer', 'StringIO', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__version__', 'excel', 'excel_tab', 'get_dialect', 'list_dialects', 're', 'reader', 'register_dialect', 'unregister_dialect', 'writer']

__all__との違いは、__all__はソースに書かれてないと表示されない。一方dir()は組み込み関数なので、__all__の記述とは関係なくアトリビュートを探す。

sys モジュールについて

sysモジュールを組み込むことによっていろいろな環境が調べられる。
(以下はすべてGentooLinux上のPython2.4の環境)

pythonの起動時に渡されたコマンドラインの引数を調べる

argv.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
print sys.argv
print len(sys.argv)
% python argv.py 
  ['argv.py']
  1
マシンのバイトオーダーを調べる
>>> sys.byteorder
'little'
<||

*** デフォルトのエンコーディングを調べる。
>|python|
sys.getdefaultencoding()
'ascii'
ファイルシステムエンコード

ファイルシステムへの変換に使用するエンコード名。getdefaultencoding()と同じ場合には"None"を返す。

>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
ロード済みのモジュールを調べる
>>> sys.modules
モジュール検索のパスを調べる
>>> sys.path
['', '/usr/lib/portage/pym', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/PIL']
インタープリタの標準入出力のエンコードを調べる。
>>> sys.stdin.encoding
'UTF-8'
>>> sys.stdout.encoding
'UTF-8'