else if の書き方

演算子に続いて忘れるのが if文。ifが違うことはないが else if が微妙に違う。

Cで書けばこうだ。

if (条件) {
    やること
} else if (次の条件) {
    やること
} else {
    やること
}

else if である。これは慣れてるのでわかりやすいと思ってる。C#Java も同様である。
しかしPythonでは以下のように書く。

if 条件:
    やること
elif 次の条件:
    やること
else:
    やること

elif である。略し方がPythonっぽい気もする。
Perlになると以下である。

if (条件) {
    やること
} elsif (次の条件) {
    やること
} else {
    やること
}

Rubyは以下

if 条件 then
    やること
elsif 次の条件 then
    やること
else
    やること
end

elsif である。Pythonを見たあとだと略し方に覚悟が足りない。
PHPにいたっては、

if (条件) {
    やること
} elseif (次の条件) {
    やること
} else {
    やること
}

と空白がないだけである。
Visual Basic も似てる。

If 条件 then
    やること
Elseif 次の条件 then
    やること
Else
    やること
End if

Pythonは elif Pythonは elif Pythonは elif Pythonは elif...

と10回唱えて覚える。

使える演算子

Pythonで使える演算子

+       -       *       **      /       //      %
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=      <>

複合演算子

 +=   -=   *=   /=   %=   **=  >>=   <<=   &=   ^=   |=

アレヤコレヤの言語を触っていると基本的なところで悩む。「++ って使えた?」「+= って使えた?」などなど。

Python は ++ はない。+= はある。
PHPPerl には両方あるが、RubyPython と一緒。

バッファフラッシュ

あるファイルの更新状況を一時的に監視したかったので、以下のプログラムを書いてみた。

import time

while 1:
    # ここでファイルの監視
    print '結果の表示'
    time.sleep(60)

シェルから

% ./check.py

と実行したら問題はないものの、

% ./check.py > log.txt &

とバックグランドでログに出力しようとしたら、時々まとめて書き出されるので tail -f とかで見ても見づらい。

import time, sys

while 1:
    # ここでファイルの監視
    print '結果の表示'
    sys.stdout.flush()    
    time.sleep(60)

と毎回バッファフラッシュしてやればいいようだ。

chopはどうやる?

Pythonには文字列の最後の文字を切り落す Perl で言うところの chop がないようだ。ファイルから1行読むと行末の改行コードがついてくるので落したい。

line = line[:-1]

という、文字列頭から終りのひとつ前までという表現で切りとればいいようだ。

追記

strip() というメソッドがあった。通常は空白と改行を取り除く、引数に文字群を与えるとその文字群に該当する文字をすべて取り除く。strip()は文字列の両端、lstrip()は文字列先頭、rstrip()は文字列の後ろとなる。

>>> "  ABC123  ".strip()
'ABC123'
>>> "  ABC123  \n".strip()
'ABC123'
>>> "  ABC123  \n".strip("\n\r")
'ABC123  '
>>> "  ABC123  \r\n".rstrip("\n\r")
'  ABC123  '

こんな感じ