Python2とPython3の違い

現在、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 それぞれの実行時の違いを示します。

>>>print("ABCD")
ABCD
>>>print "ABCD"
File"<stdin>",line 1
 print "ABCD"

SyntaxError: Missing parentheses in call to 'print'
>>>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 型で返されます。

>>> 2/3
0.666666666666666
>>> 2/3
0

上記サンプルの様に、例えば 2/3 を計算すると Python3 では小数で 0.66 と表示されますが、Python 2 では小数点以下が切り捨てられて 0 と表示されます。このため、Python 2 の環境を前提に作成されたプログラムは、Python 3 環境で実行すると異なった動作をする恐れがあります。また、この仕様変更においては Python 3 環境での実行時もエラーなどは表示されません。このため、動作が変わっても気付きにくいので注意が必要です。

なおPython 3 において、Python 2 の様に商を int 型で得るには、割り算記号を「/」でなく「//」とする必要があります。

>>> 2/3
0.666666666666666
>>> 2//3
0

long 型と int 型の統合

Python 3 では Python 2 まで存在した long 型は廃止され、すべて int 型に統合されました。また、この変更にともない int 型の上限も廃止されました。

>>> type(10**100)
<type 'int'>
>>> type(10**100)
<type 'long'>

input 関数に関する変更

Python 2 では input 関数を用いた入力は式として評価され、その結果が返されるのに対して、 Python 3 からは入力された文字を文字列として返します。

>>> input()
1 + 3
'1 + 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 の知識が必要となります。必要に応じて確認が必要です。