PEP

PEPって何?
PEP8 はペップエイトと読めばいいのかな。何か聞いたことあるような言葉だと思っていたら梅田駅前のHEP FIVEが似てる。観覧車が刺さってるビル...というツマラナイ話はおいといて。
PEP = Python Enhancement Proposals ということらしい。「Python拡張提案書」というあたりでしょうか。
ここにドカンとある。将来の提案も含めてまとまっているというのはスゴイと思う。
http://www.python.org/dev/peps/

コーディングスタイルガイド

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集というところからリンクしていた。探し方が悪かった。

タプルとは?

RubyPerlになかったタプル(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)も良く使う。
そんな理由からVimPythonを便利に使えるように設定してみる。

↓ここに書いてあった。
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処理系にとってはインデントの整合がとれてないソースができたりする。
要注意。

&& と || と !

論理和論理積と否定。C だと || と && と ! を使う。
Perl / Ruby / PHP は、これも使えるし and or not も使える。結合順序は違ったりするので単純に置き換えできるものでもないようだが。

Python の場合は and or not だけとなる。注意が必要。複数の手段がないところが Python らしい。

switch case

慣れてるのが C だから、switch 文がどうなのかが気になる。

Cで書いたらこんな感じ

switch (変数) {
case1:
    やること1;
    break;
case2:
    やること2;
    break;
default:
    やること;
    break;
}

Cのswitch文のフォールスルーは失敗だったと、どっかで読んだことがあるが。今までたくさんCのコーディングをしてきてbreakを書かないことがほとんどないことから、フォールスルーするときだけの構文を作ればよかったんじゃないかなという感想。さてPythonでは。

[結論]
Python に switch文はない。

[参考]
Perl にもない。PHPには

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

という感じになる。これもフォールスルーはない。