2系と3系の違い
Pythonではバージョン2系と3系との間に互換性がありません。 ソースコードの書き方に違いがあるため、2系のインタプリタでは動作していたスクリプトが、3系のインタプリタでは動作しない可能性があります(逆のケースあります)。 このあたりも交えてバージョン選定を行う上での注意点も簡単にまとめておきます。
2016年現在、かなり改善しつつはありますが対応ライブラリの数は2系の方が多いです。3系で開発を始めたものの、目的の機能を実装するために利用しようとしたライブラリが2系にしか対応していない、というような状況にならないよう事前に調べておく必要があります。そういった事に陥らないように、2系を選択して開発を行うケースも多いようですが、標準ライブラリのみで開発可能なプログラムであれば、最新の3系を利用して開発を行うのが良いでしょう。
標準ライブラリの「urllib」や「xmlrpclib」等のパッケージが再構成されています。モジュール名そのものが変更されていたり、階層が移動されているケースがあるので、該当するモジュールのインポートを行う場合は注意しなければなりません。
3系からprint文が関数化されたので、2系の書き方と比較してみます。以降のソースコードは、書き方に相違はあれど出力結果は同じものとなります。
Python 2系
print 'python-izm.com'
Python 3系
print('python-izm.com')
--実行結果--
python-izm.com
Python 2系
print 'python' , print '-' , print 'izm' , print 'com'
Python 3系
print('python', end=' ')
print('-', end=' ')
print('izm', end=' ')
print('com')
--実行結果(「end」はデフォルトで改行コードが入ります)--
python - izm com
Python 2系
f_obj = open('test.txt', 'w')
print >> f_obj , 'python-izm.com'
Python 3系
f_obj = open('test.txt', 'w')
print('python-izm.com', file=f_obj)
--実行結果(test.txt)--
python-izm.com
文字列の型がunicodeへ統一されました。まずは2系です。文字列の型は「unicode」と「str」の2種類が存在しています。
Python 2系
# -*- coding: utf-8 -*- test_str_1 = 'python-izm' test_str_2 = 'パイソンイズム' test_str_3 = u'パイソンイズム' print type(test_str_1) print type(test_str_2) print type(test_str_3) print '-----------------------' print test_str_1 print test_str_2 print test_str_3
--実行結果--
<type 'str'> <type 'str'> <type 'unicode'> ----------------------- python-izm (文字化け) パイソンイズム
次の3系は「unicode」型のみです。最新のバージョンでは文字列へ「u」が付与されていてもエラーにはならなくなりました。
Python 3系
test_str_1 = 'python-izm'
test_str_2 = 'パイソンイズム'
test_str_3 = u'パイソンイズム'
print(type(test_str_1))
print(type(test_str_2))
print(type(test_str_3))
print('-----------------------')
print(test_str_1)
print(test_str_2)
print(test_str_3)
--実行結果--
<class 'str'> <class 'str'> <class 'str'> ----------------------- python-izm パイソンイズム パイソンイズム
「type」での結果は「str」ですが内部的にはunicodeです。あえて分ける必要が無くなったので「str」へ統合されました。
Pythonでは2系のソースコードを3系へ変換するツールが用意されています。 これについては次項の2系から3系への変換ツール (2to3)で解説しています。
2系のコードを自動で3系へ変換!
