このページの参照数 10795 回
Pythonは2000年に、安定版であるver.1.5.2の概念を大幅に変更したver.1.6を発表、後にこれが、ver.2.xシリーズ(Python2)の基本となりました。
Python3000は、このPython2シリーズ以降の大改革です。
基本は「現行バージョンのPython実装とのコンパーチブルを犠牲にしても『Pythonはかくあるべき』という姿を求めた」もの、ということになっています。
Pythonは今まで、言語のマイナーアップデートを繰り返し、特にPython1.6(Python2)の前後から、急速に言語環境に整えてきました。
しかし、本来あった予約語(例えば、どう考えても関数扱いにすべきなprintなど)を廃止したり、単純な割り算のルール(1 / 2 ⇒ 0でなく、1 / 2 ⇒ 0.5など)を変更するなどはあまりに影響が大きすぎて、今までできませんでした。
Python 3000では、これら歴史的な文法や表記(過去の遺物?)などにもざっくりとメスを入れ、Python2で見せた以上の大変革を行うのです。
※Python2という表現は正式なものではなく、Python ver.1.6~2.x系を便宜上こう呼んでいます。
私が考えていたよりかなり昔からこの名称はあるようで、最初にこの名称が登場したのは1.6を開発している頃に「次のバージョンは西暦3000年になる」とかいう冗談から出たそうな。
この頃はPython2相当のPython 1.6やそれ以降のPython 2.xを想定していたようですが、次第に今のような話に変貌していったようです。
しかし、Guidoの冗談がきっかけで、とうとう、Python 2.xと並行したプロジェクトとして、Python 3.x(Python3000)の開発が始まったわけです。
set関数を使って定義していた集合型を、ブレース{}に要素を列挙する({1,2,3}など)ことによって、表記する、集合型リテラルが追加されます。また、リストやジェネレータと同様に、内包表記も可能。ただし、空集合は辞書の表記と区別するため、set()で作るそうな。
0b10101というような二進法表記で整数が書けるようになりました。整数を論理演算に使用する際にはとっても便利です。なお、八進法はこれまで0157とか書いてましたが、0o157とかの書き方に改められました。16進法は従来の通り0xD51とかです。
なおbin(int)によって、整数値を二進法表記の文字列に変換できます(ちょっと便利)
大きな数値(long整数)の後ろについたLの文字が無くなり、多倍長整数は完全に整数型内で内部処理されるようになります。ロング整数とかいう言葉も、無くなり、単に「Pythonはメモリの許す限りでっかい整数が扱えるんだ」ということになります。
従来のUNICODE文字列が廃止され、文字列は全てUNICODE処理されます。当初、α版リリース1ではかなり混乱したようですが、リリース2では大分落ち着いたようです
従来のPython文字列と同様のイミュータブル(不変)バイト列は、bytes型となります
Python3000では、よく使うバイト配列型が追加されました
%演算子によるフォーマットに加え、formatメソッドによるテンプレート指定が可能となりました
>>> '{0} you {1} is {2}'.format('All','need','Python')
'All you need is Python'
>>> '{1} you {2} is {0}'.format('All','need','Python')
'need you Python is All'
>>> '{a} you {c} is {b}'.format(a = 'All', c = 'need', b = 'Python')
'All you need is Python'
除算記号(/ スラッシュ)の使い方が変更されました。2.xまでは、整数/整数の結果は(割り切れなくとも)整数になりましたが、3.x以降の整数/整数の結果は(割り切れても)浮動小数点数型となります。なお、2.xで既に導入されているダブルスラッシュ//は3.xでも当然除算の結果を整数として受け取ることができます
なお、その関係で、operatorモジュールのdiv関数が削除されました。そのかわりに、切り捨てを強要するfloordivと、答えが必ず浮動小数点数となるtruedivのみとなります。
「生で挿入(raw input)」という下品なネタが使えなくなりました……という冗談はさておき、入力された文字列を式として評価していたinputが廃止され、そのまま文字列として換えるraw_inputが名前を変えてinput関数となりました。従来のinputの効果を得るには
eval(input('prompt'))
としましょう
itr.next()
でアイテムを呼び出していたイテレータ/ジェネレータが、なぜか
next(itr)
で呼び出すことに(メソッドで呼び出すなら、itr.__next__())
Pythonを「オブジェクト指向プログラミング言語」と紹介している方の神経を逆撫でするような行為ですが、実はPythonは関数がオブジェクト扱いなので、メソッドよりいろいろな面で融通が利くのです。
まぁ、普通ジェネレータ/イテレータは「回してなんぼ」ですので、forループなどの書式が変化しない限り気づかないと思いますが、アイテムを一コマ一コマ取り出したい場合にはご用心
print文とexec文が無くなり、そのままの機能で関数扱いになります。文と式がきっちりと分かれていて、扱いが違うPythonでは、余分な文法は無いほうが好ましいので、当然と言えば当然でしょう。なお、execが文から関数になった関係で、色々な悪戯が出来るようになったのは秘密です(笑)
バッククォート評価は使った事ありませんでしたが、<>はPascalライクで好きだったんですけどねぇ(ため息)
2.xでもジェネレータはこの扱いでしたが、Python3000では、リストでも、forループに使用した変数がローカル変数となり、グローバル空間には影響を及ぼさなくなります。これは、地味ではありますが、確実に便利な変更です
変更点ではないのですが、色々と噂されていたlambda文は健在です(やった!)。ただし、勿論濫用すればコードが醜くなるのはご承知の通りなので、スマートに使いましょう。
内包記法で用済みかと思われたmapやfilterは、イテレータのようなオブジェクトを返す形となって残りました。理由は、mapやfilterは、内包表記よりシンプルで見やすい場合があるので、だそうです。ただし「lambdaと併用しなければ」ということで、lambdaを使うような場合は素直に内包表記を使いましょう
applyに関しては、func(*arg)文法が使えるので、不要ということで廃止。reduceは、組み込みモジュール(組み込まれているのだけど、名前空間は別個なのでimportによる呼び出しが必要)に変更されました
callable(), coerce(), execfile(), file(), reload()
zip():イテレータオブジェクトを返します
Tkinter ⇒ tkinter