Python

デコレータ

デコレータはPython2.4から導入。 class X: @classmethod def foo(): pass この@から始まるのがデコレータで、上の例だとfooメソッドをクラスメソッドにしている。Java1.5のアノテーションによく似ているが、だからといってこういう特殊な用途のための構文と…

クラスメソッド、スタティックメソッド

クラスメソッドとスタティックメソッドの書き方 class X: def foo(cls): print 'foo' def bar(): print 'bar' foo = classmethod(foo) bar = staticmethod(bar) X.foo() X.bar() クラスメソッドはRubyと同じく普通にクラスメソッドで、第一引数にはselfの代…

ブロックの始まり

本やマニュアルでは特に言及されていないようだけど、インデントを始める前の行末には必ず:(コロン)がある。ifでもtryでもそう。コロンがあるならブロックが始まるし、ブロックが欲しいならコロンの付く文を書けばいいわけだ。たぶん構文解析でコロンを目印…

with

Python2.5から導入されたwith。これはDelphiやVisualBasicのwithみたいにブロック内でレシーバを省略できるようになるわけではなく、Rubyでopenをブロック付きで呼び出したみたいに自動でcloseなどの後始末をするための構文。C++ならスマートポインタみたい…

リストの内包表記の続き あとジェネレータ式

昨日は忘れてたけど、 [ (x, y) for x in (1, 2, 3) for y in (2, 3, 4) if y % 2 == 0 ] みたいにforをいくつも続けて2重3重x重ループにしたり、ifで絞り込んだりもできる。 上のは[(1, 2), (1, 4), (2, 2), (2, 4), (3, 2), (3, 4)]になる。 あとこれを丸…

三項演算子

三項演算子はないけど、 a = 'a' if 条件 else 'b' Python2.5からはifで似たようなことができるようになった。 後置のifじゃなくあくまで三項演算子のように使うので、elseは必須でifの左とelseの右に値がないと駄目。 でも、 import sys sys.stdout.write('…

ジェネレータ

何か作るんだろうなという漠然とした名前だけど、作るのはただのイテレータみたいなもの。 Rubyのイテレータはyieldが呼ばれると渡されたブロックを実行するけど、Pythonのジェネレータはyieldが呼ばれるとそこでジェネレータ側の処理を中断し、値を伴って呼…

単項演算子もオーバーロードできるようだ あと演算子扱いじゃないけどオーバーロードできるもの

昨日は単項演算子はできないと思っていたけど単に『初めてのPython』の表に載っていないだけだった。 実際は+と-と~とabs()ができる。abs()は関数な気もするけど+や-と似たようなものだからいいか。 それでもnotはやっぱりオーバーロードできなさそう。これ…

リストの内包表記

リストのリテラルの中だけ特殊な表記ができる。 [x ** 2 for x in (1, 2, 3)] # [1, 4, 9]になる これをやるとループの結果がリストになる。 つまり1, 2, 3が順番にxに入って、それがforの左に書かれた式でそれぞれ2乗され、順番にリストに格納されていくと…

コンパイル

Pythonのスクリプトは直接実行されるファイル以外は一度コンパイルされてファイルができるそうだ。evalする時もコンパイルされるらしいけど、ファイルができるかどうかは未確認。

制御構文

else ifはPythonだとelif。Rubyだとelsifなので注意が必要。 whileにelseがあるのが面白い。はじめからループしない条件の時に実行される。ごくまれに役立ちそうだ。 try〜exceptにもelseがあって、これは例外が発生しなかった時に実行される。どんな時にも…

演算子のオーバーロード

Pythonではすべての演算子がオーバーロード可能だ。でも演算子全部といいながら単項演算子は無かったような気がする。 # pythonのうろ覚えで書いた動作確認してないコード class X: def __init__(self): self.value = 0 def __add__(self, a): self.value +=…

変数とオブジェクト あとlambda

pythonの変数はオブジェクトを参照するだけで値は持たない。その点は別に珍しくない。 でも関数やメソッドの名前は実は変数で、関数やメソッドが代入されている。Rubyでもクラスが定数に代入されてたりしたけど、pythonはもっと徹底しているわけだ。 # pytho…

タプル、リスト、ディクショナリ

タプルというのは耳慣れないけど、要は不変なリストで、引数を複数渡したり返したりするときに知らないうちに使われていたりする。Rubyだと全部配列にしていたけど、Pythonではリストと別にタプルが用意されている上に、リテラルまで別に用意されている。 (1…

ビルトインクラス

文字列とかリストとかはよくあるスクリプト言語と似たようなもの。Rubyと比べて特に違うのは文字列が不変だということ。Javaみたいに不変。だから破壊的メソッドのようなものはない。 あと基本的にメソッドはselfを返さないので、Rubyみたく # ruby a = [2, …

インデント

まず一番重要なのはやっぱりインデント。スコープはインデントが揃った範囲になるので、C系の言語みたいに{}でくくるとかも、DelphiやRubyみたいにendを付けるとかもいらない。これは特定のスタイルを要求するので堅苦しいのかと思っていたけど、インデント…

Python

Google App Engineを試そうと思ってとりあえす『初めてのPython』を読み始めて3日目。構文のところはだいたい読み終えたのでPythonがどんな感じなのか、主にRubyと比較しながら整理してみる。 構文だけみるとそう悪くないかもと思えてきた。Rubyとは違う部分…