コーディングスタイルガイド
TAB と SPACE
http://d.hatena.ne.jp/climpy/20090912/1252709716
にコメントを頂いた。ありがとうございます。
PEP8
http://oldriver.org/python/pep-0008j.html
という文書にコーディングスタイルガイドがあった。ここには「スペースとタブは混在させるんじゃねえ」というような文章がある。それ以外にも演算子の前後に空白入れようとか、if文の:はくっつけてねとか、この先の悩みを解決してくれそうな重要で有益な文章だ。
この有益な文章は http://www.python.jp/ などからたどることはできなかった。リンクされてるにしても初心者にはみつからなかったので、わかりにくいところにあるんだろう。もったいない話である。
訂正
http://www.python.jp/Zope/links/python_documents
の日本語PEP集というところからリンクしていた。探し方が悪かった。
タプルとは?
RubyやPerlになかったタプル(Tuple)という概念がでてきた。これはリストとどう違うのだろう。
tup = (1, 2, 3, 4)
というように定義して
print tup[1]
というように利用。これがリストだと、
lst = [1, 2, 3, 4] print lst[1]
だ。ううむ定義の方法が違うが何が違うんだ。
タプルは変更ができないようだ。
tup[2] = 100 # これはエラー lst[2] = 100 # これはOK
単にRead Onlyのリストなんだろうか。
調べてみた。型自由な構造体というか何というか。リストはハッシュのキーになれないがタプルは中身が同じであれば同じハッシュ値になることが保証されているそうなのでキーとして使える。ということらしい。
すっきりしない。
VimのPython向け設定
インデント方法には空白派かタブ派かがあるようだが私は空白派である。
更にいえば Vi派か Emacs派かと聞かれれば Emacs派であるが、諸事情でEmacsが動かない環境で簡単なプログラムを書く必要に迫られることもあって Vi(Vim)も良く使う。
そんな理由からVimでPythonを便利に使えるように設定してみる。
↓ここに書いてあった。
http://wiki.python.org/moin/ViImproved%20%28Vim%29
~/.vimrc に
autocmd BufRead,BufNewFile *.py syntax on autocmd BufRead,BufNewFile *.py set ai autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,with,try,except,finally,def,class
を追記、これで構文強調表示と自動字下げが設定される。
つづいて
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
をソースコード中に書くことにする。これでタブ文字は8文字として表示、タブキーを押したら空白4文字が入る。参考ページは tabstop=4 だったが、Python処理系は8と認識してるので危険なので変更した。
TAB と SPACE
Python はインデントで制御ブロックを示すのでインデントは重要だ。
リファレンスにもインデントのページがある。
http://www.python.jp/doc/release/ref/indentation.html
ここで重要なのは
タブは (左から右の方向に) 1 つから 8 つのスペースで置き換えられ、置き換え後の文字列の終わりの位置までの文字数が 8 の倍数になるように調整されます
ということ。人間がタブ幅を4文字にして編集しててもPython処理系は8文字分として計算している。このためタブ幅4文字にしているエディタで編集中に空白4文字でインデントを調整したりすると、Python処理系にとってはインデントの整合がとれてないソースができたりする。
要注意。
switch case
慣れてるのが C だから、switch 文がどうなのかが気になる。
Cで書いたらこんな感じ
switch (変数) { case 値1: やること1; break; case 値2: やること2; break; default: やること; break; }
Cのswitch文のフォールスルーは失敗だったと、どっかで読んだことがあるが。今までたくさんCのコーディングをしてきてbreakを書かないことがほとんどないことから、フォールスルーするときだけの構文を作ればよかったんじゃないかなという感想。さてPythonでは。
[結論]
Python に switch文はない。
switch (評価する変数) { case 値1: やること; break; case 値2: やること; break; default: やること; break; }
というCに似た構文がある。
Rubyだと case when 文
case 評価する変数 when 条件1 やること when 条件2 やること else やること end
こんな感じになる。フォールスルーはない。
最後に Visual Basic は Select Case 文
Select Case Age Case 条件1 やること Case 条件2 やること Case Else やること End Select
という感じになる。これもフォールスルーはない。