このページの参照数 10772 回
Pythonは2000年に、安定版であるver.1.5.2の概念を大幅に変更したver.1.6を発表、後にこれが、ver.2.xシリーズ(Python2)の基本となりました。
Python 3000(Python3)は、この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(Python3000)の開発が始まり、2008年12月に3.0として正式にこの世に現れたのです
新機能より、まず「使えなくなった書式」をチェックすべきです。現在出版されている2.xベースの書籍が全て使えなくなってしまうわけではありませんが、そのままで使えなくなるコードはかなり出てくるでしょう(書き直しが不可能なコードは、ほとんど無いでしょうが)。入門書であれば、print文をprint関数に書き換えるだけでも、けっこうイケます。あと、ユニコード文字(日本語全角文字など)は、u"string"という書式が廃止されましたので注意してください。
タプルの展開による代入は、Pythonの便利な書式の一つでした。
>>> a, b, c = 1, 2, 3 >>> print(a, b, c) 1 2 3
しかし、シーケンスの項目と同じ数だけ変数を用意しなければなりませんでした。 それ以外はスライスを使う、ということなのですが、スライスは慣れないとなかなか使うのが難しいですし、あまり直感的でもありません。 今回の文法の改定では、関数の引数リストのような書式で「引数のあまり」を指定できるようになりました。
>>> a, *b, c, d = 1, 2, 3, 4, 5, 6 >>> print(a, b, c) 1 [2, 3, 4] 5 6
使い出すとこれは意外に便利です
set関数を使って定義していた集合型を、ブレース{}に要素を列挙する({1,2,3}など)ことによって、表記する、集合型リテラルが追加されます。また、リストやジェネレータと同様に、内包表記も可能。
>>> {x for x in range(10)} {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
ただし、空集合は辞書の表記と区別するため、set()で作ります
>>> {x: x**2 for x in (2, 4, 6)} {2: 4, 4: 16, 6: 36}
0b10101というような二進法表記で整数が書けるようになりました。整数を論理演算に使用する際にはとっても便利です。なお、八進法はこれまで0157とか書いてましたが、0o157とかの書き方に改められました。16進法は従来の通り0xD51とかです。
なおbin(int)によって、整数値を二進法表記の文字列に変換できます(ちょっと便利)
大きな数値(long整数)の後ろについたLの文字が無くなり、多倍長整数は完全に整数型内で内部処理されるようになります。ロング整数とかいう言葉も、無くなり、単に「Pythonはメモリの許す限りでっかい整数が扱えるんだ」ということになります。
従来のUNICODE文字列が廃止され、文字列は全てUNICODE処理されます。u"string"といった書式はすでにありませんので、注意してください。
従来の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'
なお、%演算子によるフォーマットは廃止されるようですので、3.0系につきあう方は、こちらの方式を積極的に採用していったほうがいいかもしれません。
除算記号(/ スラッシュ)の使い方が変更されました。2.xまでは、整数/整数の結果は(割り切れなくとも)整数になりましたが、3.x以降の整数/整数の結果は(割り切れても)浮動小数点数型となります。なお、2.xで既に導入されているダブルスラッシュ//は3.xでも当然除算の結果を整数として受け取ることができます
なお、その関係で、operatorモジュールのdiv関数が削除されました。そのかわりに、切り捨てを強要するfloordivと、答えが必ず浮動小数点数となるtruedivのみとなります。
入力された文字列を式として評価していたinputが廃止され、そのまま文字列として換えるraw_inputが名前を変えてinput関数となりました。従来のinputの効果を得るには
eval(input('prompt'))
としましょう
itr.next()
でアイテムを呼び出していたイテレータ/ジェネレータが、なぜか
next(itr)
で呼び出すことに(メソッドで呼び出すなら、itr.__next__())
Pythonを「オブジェクト指向プログラミング言語」と紹介している方の神経を逆撫でするような行為ですが、実はPythonは関数がオブジェクト扱いなので、メソッドよりいろいろな面で融通が利くのです。
まぁ、普通ジェネレータ/イテレータは「回してなんぼ」ですので、forループなどの書式が変化しない限り気づかないと思いますが、アイテムを一コマ一コマ取り出したい場合にはご用心
print文とexec文が無くなり、そのままの機能で関数扱いになります。文と式がきっちりと分かれていて、扱いが違うPythonでは、余分な文法は無いほうが好ましいので、当然と言えば当然でしょう。なお、execが文から関数になった関係で、色々な悪戯が出来るようになったのは秘密です(笑)
バッククォート評価は使った事ありませんでしたが、<>はPascalライクで好きだったんですけどねぇ(ため息)
バッククォート評価とは……
`1+2` ⇒ '3'
というようなモノで、同じ機能はrepr(1+2) ⇒ '3'
となります。
2.xでもジェネレータはこの扱いでしたが、Python3000では、リストでも、forループに使用した変数がローカル変数となり、グローバル空間には影響を及ぼさなくなります。これは、地味ではありますが、確実に便利な変更です
変更点ではないのですが、色々と噂されていたlambda文は健在です(やった!)。ただし、勿論濫用すればコードが醜くなるのはご承知の通りなので、スマートに使いましょう。
内包記法で用済みかと思われたmapやfilterは、イテレータのようなオブジェクトを返す形となって残りました。理由は、mapやfilterは、内包表記よりシンプルで見やすい場合があるので、だそうです。ただし「lambdaと併用しなければ」ということで、lambdaを使うような場合は素直に内包表記を使いましょう
applyに関しては、func(*arg)文法が使えるので、不要ということで廃止。reduceは、functoolsモジュールに移動されました。
callable, coerce, execfile, file, reload, raw_input
reduce | → | functools.reduce |
reload | → | imp.reload(module)[impはモジュールオブジェクト] |
intern | → | sys.intern |
range, map, filter, zip
特にrangeは、ほぼ言語仕様に匹敵する重要関数なので、要チェック。
新 dbm | ← | 旧 anydbm, dbhash, dbm, dumbdbm, gdbm, whichdb |
新 html | ← | 旧 HTMLParser, htmlentitydefs |
新 http | ← | 旧 httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib |
新 tkinter | ← | 旧 全Tkinter関連モジュール(tutleを除く) |
新 urllib | ← | 旧 urllib, urllib2, urlparse, robotparse |
新 xmlrpc | ← | 旧 xmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer |
メタクラスの設定が、スロットではなく、規定クラスのように指定できるようになりました。
(旧)
class C: __metaclass__ = M ...
(新)
class C(metaclass=M): ...
大した変更じゃないのだけど、あまりにどこでも話題にならないので、ここでちこっと記述
class C(object): def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I'm the 'x' property.")
が、
class C(object): @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x
で、OK。とってもスッキリ。
今まで<type 'int'>とか出ていたモノが、こっそり<class 'int'>などに統合。分かりやすくなりました。ちなみにコレ、どうやらリリース中に行われた変更のようです。
簡単に
>>> def f(): ... a = 1 ... b = 2 ... c = 3 ... def ff(): ... a = 10 ... global b ... b = 20 ... nonlocal c ... c = 30 ... ff() ... return a,b,c ... >>> f() (1, 2, 30) >>> b 20 >>>
#comment_nospam