#ref(http://www.python.org/images/python-logo.gif) [[Python Programing Langage>http://python.org/]] このページの参照数 &counter; 回 #contents *Python3000のα版 [#be5cc3cc] -2007.08.31:Python 3.0 a1 -2007.12.07:Python 3.0 a2 -2008.03.01:Python 3.0 a3 -2008.04.02:Python 3.0 a4 -2008.05.08:Python 3.0 a5 *Python3000のβ版[#vb253c3f] -2008.06.18:Python 3.0 b1 -2008.07.17:Python 3.0 b2(New!!) *今後の予定([[PEP361>http://www.python.org/dev/peps/pep-0361/]]) [#tb55df5e] -2008.08.23:b3 -2008.09.03:rc1 -2008.09.17:rc2 -2008.10.01:fintal *Python3000とは? [#y107fdb9] **Python2以来の大改革 [#o4495456] 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系を便宜上こう呼んでいます。 **発端 [#g3a95d1f] 私が考えていたよりかなり昔からこの名称はあるようで、最初にこの名称が登場したのは1.6を開発している頃に「次のバージョンは西暦3000年になる」とかいう冗談から出たそうな。~ この頃はPython2相当のPython 1.6やそれ以降のPython 2.xを想定していたようですが、次第に今のような話に変貌していったようです。~ しかし、Guidoの冗談がきっかけで、とうとう、Python 2.xと並行したプロジェクトとして、Python 3.x(Python3000)の開発が始まったわけです。 *組み込み型に関する変更 [#w59b7b9c] **集合型リテラル [#f09310b0] set関数を使って定義していた集合型を、ブレース{}に要素を列挙する({1,2,3}など)ことによって、表記する、集合型リテラルが追加されます。また、リストやジェネレータと同様に、内包表記も可能。ただし、空集合は辞書の表記と区別するため、set()で作るそうな。 **辞書に関する変更 [#db21f431] -has_keyメソッドの廃止。key in dictで統一。 -keys,itemsがリストではなくイテレータオブジェクトを返します **二進法リテラルの追加と八進法リテラルの変更 [#j0c2f219] 0b10101というような二進法表記で整数が書けるようになりました。整数を論理演算に使用する際にはとっても便利です。なお、八進法はこれまで0157とか書いてましたが、0o157とかの書き方に改められました。16進法は従来の通り0xD51とかです。 なおbin(int)によって、整数値を二進法表記の文字列に変換できます(ちょっと便利) **整数型の統合(long型とlong型リテラルの廃止) [#a6c45224] 大きな数値(long整数)の後ろについたLの文字が無くなり、多倍長整数は完全に整数型内で内部処理されるようになります。ロング整数とかいう言葉も、無くなり、単に「Pythonはメモリの許す限りでっかい整数が扱えるんだ」ということになります。 **文字列の変更と拡張(1)文字列型(str型) [#t6130dcc] 従来のUNICODE文字列が廃止され、文字列は全てUNICODE処理されます。当初、α版リリース1ではかなり混乱したようですが、リリース2では大分落ち着いたようです **文字列の変更と拡張(2)従来のPython文字列(bytes型) [#hed6446f] 従来のPython文字列と同様のイミュータブル(不変)バイト列は、bytes型となります **文字列の変更と拡張(3)変更可能なバイト列(bytearray型) [#r4f79f36] Python3000では、よく使うバイト配列型が追加されました **文字列の変更と拡張(4)テンプレート機能 [#bc57841d] %演算子によるフォーマットに加え、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' *演算子、関数の変更と追加 [#s982bfaa] **「整数/整数」の結果が違う [#k348fbd3] 除算記号(/ スラッシュ)の使い方が変更されました。2.xまでは、整数/整数の結果は(割り切れなくとも)整数になりましたが、3.x以降の整数/整数の結果は(割り切れても)浮動小数点数型となります。なお、2.xで既に導入されているダブルスラッシュ//は3.xでも当然除算の結果を整数として受け取ることができます なお、その関係で、operatorモジュールのdiv関数が削除されました。そのかわりに、切り捨てを強要するfloordivと、答えが必ず浮動小数点数となるtruedivのみとなります。 **旧raw_input ⇒ 新input、旧input ⇒ 削除 [#h1028d0a] 「生で挿入(raw input)」という下品なネタが使えなくなりました……という冗談はさておき、入力された文字列を式として評価していたinputが廃止され、そのまま文字列として換えるraw_inputが名前を変えてinput関数となりました。従来のinputの効果を得るには >eval(input('prompt')) としましょう **イテレータ/ジェネレータの呼び出しが微妙に変化 [#x589d7d2] >itr.next() でアイテムを呼び出していたイテレータ/ジェネレータが、なぜか >next(itr) で呼び出すことに(メソッドで呼び出すなら、itr.__next__()) Pythonを「オブジェクト指向プログラミング言語」と紹介している方の神経を逆撫でするような行為ですが、実はPythonは関数がオブジェクト扱いなので、メソッドよりいろいろな面で融通が利くのです。 まぁ、普通ジェネレータ/イテレータは「回してなんぼ」ですので、forループなどの書式が変化しない限り気づかないと思いますが、アイテムを一コマ一コマ取り出したい場合にはご用心 *文法、記法の変更 [#yf408b5b] **print文、exec文の廃止 ⇒ print関数、exec関数の導入 [#p6ae3970] print文とexec文が無くなり、そのままの機能で関数扱いになります。文と式がきっちりと分かれていて、扱いが違うPythonでは、余分な文法は無いほうが好ましいので、当然と言えば当然でしょう。なお、execが文から関数になった関係で、色々な悪戯が出来るようになったのは秘密です(笑) **バッククォート評価(``)や≠の(<>)表記の削除 [#qaad3b14] バッククォート評価は使った事ありませんでしたが、<>はPascalライクで好きだったんですけどねぇ(ため息) **リストの内包記法内の変数がローカルに [#xbbaa250] 2.xでもジェネレータはこの扱いでしたが、Python3000では、リストでも、forループに使用した変数がローカル変数となり、グローバル空間には影響を及ぼさなくなります。これは、地味ではありますが、確実に便利な変更です *λ(lambda)とその一族 [#h5c50f70] **lambda文は健在 [#f8ae442f] 変更点ではないのですが、色々と噂されていたlambda文は健在です(やった!)。ただし、勿論濫用すればコードが醜くなるのはご承知の通りなので、スマートに使いましょう。 **map,filterは、イテレートオブジェクトを返す [#ibf4b853] 内包記法で用済みかと思われたmapやfilterは、イテレータのようなオブジェクトを返す形となって残りました。理由は、mapやfilterは、内包表記よりシンプルで見やすい場合があるので、だそうです。ただし「lambdaと併用しなければ」ということで、lambdaを使うような場合は素直に内包表記を使いましょう **applyは廃止、reduceはモジュールに [#w373b36d] applyに関しては、func(*arg)文法が使えるので、不要ということで廃止。reduceは、組み込みモジュール(組み込まれているのだけど、名前空間は別個なのでimportによる呼び出しが必要)に変更されました *その他、廃止/変更された関数 [#e5c7f9f8] **廃止された関数(追跡調査中のものも含む) [#bdcdb992] callable(), coerce(), execfile(), file(), reload() **変更された関数 [#obcfed13] zip():イテレータオブジェクトを返します **変更されたモジュール [#o5819214] Tkinter ⇒ tkinter *Python3000についての資料 [#q75fc8a6] -正式勧告文書 [[PEP3000:http://web.archive.org/web/20060618034645/http://www.python.org/dev/peps/pep-3000/]] -「みんPy」の柴田さんの説明「[[もっと知りたいPython3000:http://gihyo.jp/dev/feature/01/python3000]]」 -Hatena::Diary[[2007-06-07プログラミング日記:http://d.hatena.ne.jp/morchin/20070627]] -上記の元ネタ[[「Python 3000 Status Update(Long!)」:http://www.artima.com/weblogs/viewpost.jsp?thread=208549]] -Guido師の説明[[What's New in Python 3.0:http://docs.python.org/dev/3.0/whatsnew/3.0.html]] *関連ページ [#vf2a75a0] -[[Python一般について>Python]] -[[ここがヘンだよPythonista]] *コメント [#bdc90f5f] #comment