トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS   ログイン

TOP>Python3000
python-logo.gif

Python Programing Langage

このページの参照数 10786 回

The Latest Version Python 3 Download here!

(最新バージョンPython 3 ダウンロード)

Python 3000(Python3)とは?

Python2以来の大改革

 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として正式にこの世に現れたのです

Python 3000(Python3)へ移行するための緊急チェックポイント!

 新機能より、まず「使えなくなった書式」をチェックすべきです。現在出版されている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型とlong型リテラルの廃止)

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

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

従来のUNICODE文字列が廃止され、文字列は全てUNICODE処理されます。u"string"といった書式はすでにありませんので、注意してください。

文字列の変更と拡張(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'

なお、%演算子によるフォーマットは廃止されるようですので、3.0系につきあう方は、こちらの方式を積極的に採用していったほうがいいかもしれません。

演算子、関数の変更と追加

「整数/整数」の結果が違う

 除算記号(/ スラッシュ)の使い方が変更されました。2.xまでは、整数/整数の結果は(割り切れなくとも)整数になりましたが、3.x以降の整数/整数の結果は(割り切れても)浮動小数点数型となります。なお、2.xで既に導入されているダブルスラッシュ//は3.xでも当然除算の結果を整数として受け取ることができます

 なお、その関係で、operatorモジュールのdiv関数が削除されました。そのかわりに、切り捨てを強要するfloordivと、答えが必ず浮動小数点数となるtruedivのみとなります。

旧raw_input ⇒ 新input、旧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ライクで好きだったんですけどねぇ(ため息)

バッククォート評価とは……

`1+2` ⇒ '3'
というようなモノで、同じ機能は

repr(1+2) ⇒ '3'
となります。

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

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

λ(lambda)とその一族

lambda文は健在

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

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

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

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

 applyに関しては、func(*arg)文法が使えるので、不要ということで廃止。reduceは、functoolsモジュールに移動されました。

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

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

callable, coerce, execfile, file, reload, raw_input

変更された関数

reducefunctools.reduce
reloadimp.reload(module)[impはモジュールオブジェクト]
internsys.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):
    ...

propertyがデコレータで書ける

大した変更じゃないのだけど、あまりにどこでも話題にならないので、ここでちこっと記述

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~がclassに統合

今まで<type 'int'>とか出ていたモノが、こっそり<class 'int'>などに統合。分かりやすくなりました。ちなみにコレ、どうやらリリース中に行われた変更のようです。

予約語(reseved words)に関する変更

nonlocalの使い方

簡単に

>>> 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
>>>

Python3000についての資料

関連ページ

現状

コメント

#comment_nospam


Last-modified: 2023-12-14 (木) 22:31:42