トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS   ログイン


python-logo.gif

Python Programing Langage

このページの参照数 10650 回

Python3000のα版

Python3000のβ版

今後の予定(PEP361)

Python3000とは?

Python2以来の大改革

 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型とlong型リテラルの廃止)

大きな数値(long整数)の後ろについたLの文字が無くなり、多倍長整数は完全に整数型内で内部処理されるようになります。ロング整数とかいう言葉も、無くなり、単に「Pythonはメモリの許す限りでっかい整数が扱えるんだ」ということになります。

文字列の変更と拡張(1)文字列型(str型)

従来のUNICODE文字列が廃止され、文字列は全てUNICODE処理されます。当初、α版リリース1ではかなり混乱したようですが、リリース2では大分落ち着いたようです

文字列の変更と拡張(2)従来のPython文字列(bytes型)

従来のPython文字列と同様のイミュータブル(不変)バイト列は、bytes型となります

文字列の変更と拡張(3)変更可能なバイト列(bytearray型)

Python3000では、よく使うバイト配列型が追加されました

文字列の変更と拡張(4)テンプレート機能

%演算子によるフォーマットに加え、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、旧input ⇒ 削除

「生で挿入(raw input)」という下品なネタが使えなくなりました……という冗談はさておき、入力された文字列を式として評価していたinputが廃止され、そのまま文字列として換えるraw_inputが名前を変えてinput関数となりました。従来のinputの効果を得るには

eval(input('prompt'))

としましょう

イテレータ/ジェネレータの呼び出しが微妙に変化

itr.next()

でアイテムを呼び出していたイテレータ/ジェネレータが、なぜか

next(itr)

で呼び出すことに(メソッドで呼び出すなら、itr.__next__())

Pythonを「オブジェクト指向プログラミング言語」と紹介している方の神経を逆撫でするような行為ですが、実はPythonは関数がオブジェクト扱いなので、メソッドよりいろいろな面で融通が利くのです。

まぁ、普通ジェネレータ/イテレータは「回してなんぼ」ですので、forループなどの書式が変化しない限り気づかないと思いますが、アイテムを一コマ一コマ取り出したい場合にはご用心

文法、記法の変更

print文、exec文の廃止 ⇒ print関数、exec関数の導入

print文とexec文が無くなり、そのままの機能で関数扱いになります。文と式がきっちりと分かれていて、扱いが違うPythonでは、余分な文法は無いほうが好ましいので、当然と言えば当然でしょう。なお、execが文から関数になった関係で、色々な悪戯が出来るようになったのは秘密です(笑)

バッククォート評価(``)や≠の(<>)表記の削除

バッククォート評価は使った事ありませんでしたが、<>はPascalライクで好きだったんですけどねぇ(ため息)

リストの内包記法内の変数がローカルに

2.xでもジェネレータはこの扱いでしたが、Python3000では、リストでも、forループに使用した変数がローカル変数となり、グローバル空間には影響を及ぼさなくなります。これは、地味ではありますが、確実に便利な変更です

λ(lambda)とその一族

lambda文は健在

変更点ではないのですが、色々と噂されていたlambda文は健在です(やった!)。ただし、勿論濫用すればコードが醜くなるのはご承知の通りなので、スマートに使いましょう。

map,filterは、イテレートオブジェクトを返す

 内包記法で用済みかと思われたmapやfilterは、イテレータのようなオブジェクトを返す形となって残りました。理由は、mapやfilterは、内包表記よりシンプルで見やすい場合があるので、だそうです。ただし「lambdaと併用しなければ」ということで、lambdaを使うような場合は素直に内包表記を使いましょう

applyは廃止、reduceはモジュールに

 applyに関しては、func(*arg)文法が使えるので、不要ということで廃止。reduceは、組み込みモジュール(組み込まれているのだけど、名前空間は別個なのでimportによる呼び出しが必要)に変更されました

その他、廃止/変更された関数

廃止された関数(追跡調査中のものも含む)

callable(), coerce(), execfile(), file(), reload()

変更された関数

zip():イテレータオブジェクトを返します

変更されたモジュール

Tkinter ⇒ tkinter

Python3000についての資料

関連ページ

コメント