読者です 読者をやめる 読者になる 読者になる

Masa / Lino Blog

Masanori Satoh ( Masa / Lino ) の徒然ブログです

Javaプログラマ Pythonを学ぶ 〜特殊なループ・クラス編

Python

みんなのPython 改訂版を片手に、Pythonを勉強中です。

リストコンプリヘンション

リストコンプリヘンション(リスト内包式)を使うと、スクリプト言語っぽくループや分岐を1行で短くかけます。
ただ、当然可読性が下がります。

f = open("./sample.txt", "r")
# ファイルから1行ずつ読み込んで、開始文字列が#じゃなければ、
# 読み込んだ行を,で分割してリストを返す
words = [ line.split(",") 
          for line in f.readlines() 
          if not line.startswith("#") ]
print words
word = []
for line in f.readlines():
  if not line.startswith("#"):
    word.append(line.split(","))

上記のプログラムは同じ結果を返しますが、上の方がスマートですが、コメントがないとwordsに何が入るか忘れてそう…。


個人的には、一行で書いても複数行で書いても処理性能が変わらない場合、複数行で書いて可読性を上げるほうがいいと思っています。
特に型宣言がないタイプの言語は、プログラムを1ヵ月後とかに見ると、何をどういう風に処理しているか、すぐ忘れるので…。
# 上記の点は個人差があると思いますが。

ジェネレータ

ジェネレータ (プログラミング) 出典: フリー百科事典『ウィキペディア(Wikipedia)』が使えます。


大量データを扱うときには便利かも知れません。

クラス宣言・コンストラクタ

この辺はJavaと同じですね。オブジェクト指向を理解していれば、特に思うところはありません。
ただ、動的言語らしくクラス側で宣言していない値を呼び出し側でセットしたりできます。
# メタクラスなるものを使えば制御できるらしいです。


また、コンストラクタの第一引数やクラス内の関数の引数にself(名前は何でもOK)を渡す必要があります。
インタプリタ上でそういう動作になっているみたいです。

クラス内のプライベート変数

  • _valueのような変数は慣例としてアクセスしてはいけない。
  • __valueのような変数は同じ名前ではアクセスできない。
    • ただし、_ClassName__valueのような形で無理やりアクセスできる。


この辺はJavaとは大きく違います。
個人的にはこれだけやっていれば十分だとは思います。