現在、PythonにはPython 2とPython 3の2つのバージョンが並列して存在しています。一般的には、新しいバージョンは後方互換性(新しいバージョンでも、古いバージョンの機能が使用できること)を持つのですが、Python 3 におていはPython 2 と一部仕様が異なってい、という問題があります。この為、Python 2 を前提としたプログラムは、Python 3 の環境では動かなかったり、結果が異なることがあります。今回は、Python 2とPython 3 の大きな変更点を紹介します。
print 関数に関する変更
代表的な違いとしてprint 関数が挙げられます。Python 3 では引数として括弧が必須ですが、Python 2 では必須とはされていません。以下に、Python 3 とPython 2 それぞれの実行時の違いを示します。
1 2 3 4 5 6 7 |
>>>print("ABCD") ABCD >>>print "ABCD" File"<stdin>",line 1 print "ABCD" SyntaxError: Missing parentheses in call to 'print' |
1 2 3 4 |
>>>print("ABCD") ABCD >>>print "ABCD" ABCD |
Python 2 では引数に括弧を付けても付けなくても文字列は表示されますが、Python 3では括弧を付けないとエラーが表示されます。この為、Python 2 基準で作成したプログラムをPython3 環境でそのまま実行すると、動作しない恐れがあるのです。
ただし、動作しない部分でエラーが表示されるので問題発生点を見つけることは容易です。
割り算に関する変更
int 型同士の割り算についても Python 3 と Python 2 では挙動が変化しています。Python 3 では、int 型同士の割り算の商はfloat 型で返されるのに対し、Python 2 では int 型で返されます。
1 2 |
>>> 2/3 0.666666666666666 |
1 2 |
>>> 2/3 0 |
上記サンプルの様に、例えば 2/3 を計算すると Python3 では小数で 0.66 と表示されますが、Python 2 では小数点以下が切り捨てられて 0 と表示されます。このため、Python 2 の環境を前提に作成されたプログラムは、Python 3 環境で実行すると異なった動作をする恐れがあります。また、この仕様変更においては Python 3 環境での実行時もエラーなどは表示されません。このため、動作が変わっても気付きにくいので注意が必要です。
なおPython 3 において、Python 2 の様に商を int 型で得るには、割り算記号を「/」でなく「//」とする必要があります。
1 2 3 4 |
>>> 2/3 0.666666666666666 >>> 2//3 0 |
long 型と int 型の統合
Python 3 では Python 2 まで存在した long 型は廃止され、すべて int 型に統合されました。また、この変更にともない int 型の上限も廃止されました。
1 2 |
>>> type(10**100) <type 'int'> |
1 2 |
>>> type(10**100) <type 'long'> |
input 関数に関する変更
Python 2 では input 関数を用いた入力は式として評価され、その結果が返されるのに対して、 Python 3 からは入力された文字を文字列として返します。
1 2 3 |
>>> input() 1 + 3 '1 + 3' |
1 2 3 |
>>> input() 1 + 3 4 |
Python 2 でも入力を文字列として扱いたい場合は、raw_input 関数を使用します。
まとめ
今回はPython 2 と 3 に関する変更を一部紹介しました。Python 3 は 2008 年にリリースされ開発され続けている一方、Python 2 は2010年のメジャーリリースが最終版となっています。Python 3 のリリース直後は、Python 2 に比べ対応ライブラリの数が少ないなど不便がありましたが、近年では Python 3 の環境も整備されてきています。このため、今後新規に学習したり開発するにはPython 3 で問題ないでしょう。一方、現在もPython 2 の使われているシステムも健在なため、既存システムを操作する場合は Python 2 の知識が必要となります。必要に応じて確認が必要です。