Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python 2.xとPython 3.xの違いを徹底解説!初心者が知るべき5つのポイント

プログラミングコミュニティでは、「学ぶべきはPython 2.xか、それともPython 3.xか」という議論が長年繰り広げられてきました。現在ではPython 2は2020年1月にサポートが終了(EOL)しており、新規開発にはPython 3の使用が強く推奨されています。しかし、レガシーコードの保守や移行作業では、両者の違いを正しく理解することが不可欠です。

この記事では、Python 2.xとPython 3.xの主要な違いを5つのポイントに分けてわかりやすく解説します。

1. print関数の扱い

最大の違いの一つが「print」の扱いです。Python 2.xではprintはステートメント(文)として扱われますが、Python 3.xでは明確に関数として扱われます。そのため、Python 3では出力したい内容を関数呼び出しと同様に括弧()の中に渡す必要があります。括弧を省略すると構文エラー(SyntaxError)が発生します。

#Python 2.7 のコード例

#Python 2.7

print 'Python', python_version()
print 'Hello, World!'
print('Hello, World!')
print "text", ; print 'some more text here'

実行結果

Python 2.7.6
Hello, World!
Hello, World!
text some more text here

#Python 3 のコード例

import sys
print("Python version is %s.%s.%s" %sys.version_info[:3])
print('Hello, World!')

print("some text,", end="")
print('some more text here')

実行結果

Python version is 3.6.1
Hello, World!
some text,some more text here

なお、Python 3で括弧なしのprint文を書くと、以下のようなエラーが出力されます。

>>> print "Hello"
Syntax Error: Missing parentheses in call to 'print'

2. 整数除算(Integer Division)の挙動

Python 2では、小数点以下を含まない数値はすべて整数(int)として扱われるため、除算時に予期しない結果になることがあります。例えば、Python 2で 3 / 2 という式を評価すると、期待される「1.5」ではなく「1」が返されます。

これに対してPython 3では、/ 演算子による除算は常に浮動小数点数(float)を返します。整数除算を行いたい場合は // 演算子を使用します。もしコードベースをPython 2環境でも動作させたい場合は、Python 3側で float(x) を使うか、Python 2のスクリプトに from __future__ import division を追加する方法が推奨されます。

#Python 2 のコード例

print 'Python', python_version()
print '3 / 2 =', 3 / 2
print '3 // 2 =', 3 // 2
print '3 / 2.0 =', 3 / 2.0
print '3 // 2.0 =', 3 // 2.0

実行結果

Python 2.7.6
3 / 2 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

#Python 3 のコード例

import sys
print('Python %s.%s.%s' %sys.version_info[:3])
print('3 / 2 =', 3 / 2)
print('3 // 2 =', 3 // 2)
print('3 / 2.0 =', 3 / 2.0)
print('3 // 2.0 =', 3 // 2.0)

実行結果

Python 3.6.1
3 / 2 = 1.5
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

3. Unicode文字列の扱い

Python 3では、文字列はデフォルトでUnicodeとして保存されます。一方、Python 2では文字列をUnicodeとして扱いたい場合、先頭に「u」を付けて明示的に指定する必要がありました。

Unicode文字列は、Python 2のデフォルトであるASCII文字列よりも柔軟性が高く、外国語の文字や絵文字(emoji)、標準的なローマ字・数字なども格納できます。国際化対応の観点からも、これはPython 3の大きな利点と言えるでしょう。

#Python 2 のコード例

>>> print type(unicode('this is like a python3 str type'))
<type 'unicode'>
>>> print type(b'byte type does not exist')
<type 'str'>
>>> print 'they are really' + b' the same'
they are really the same

#Python 3 のコード例

import sys
print('Python %s.%s.%s' %sys.version_info[:3])
print('strings are now utf-8 \u03BCnico\u0394é!')
print('Python %s.%s.%s' %sys.version_info[:3], end="")
print(' has', type(b' bytes for storing data'))
print('Python %s.%s.%s' %sys.version_info[:3], end="")
print(' also has', type(bytearray(b'bytearrays')))

実行結果

Python 3.6.1
strings are now utf-8 μnicoΔé!
Python 3.6.1 has <class 'bytes'>
Python 3.6.1 also has <class 'bytearray'>

なお、Python 3では文字列(str)とバイト列(bytes)を直接連結しようとするとエラーになります。

>>> print ('they are really' + b' the same')
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
print ('they are really' + b' the same')
TypeError: must be str, not bytes

4. 例外の発生(Raising Exception)方法

例外を発生させる際の構文にも違いがあります。ユーザーにエラーメッセージを出力したい場合、Python 3では次の構文を使用します。

raise IOError("your error message")

この構文はPython 2とPython 3の両方で動作するため、互換性を保ちたいコードではこちらを使いましょう。

しかし、以下のようにカンマ区切りで記述する古い構文は、Python 2でのみ有効であり、Python 3ではエラーになります。

raise IOError, "your error message"

5. リスト内包表記におけるループ変数のスコープ

Python 2では、forループで反復処理に使用する変数にグローバル変数と同じ名前を付けると、グローバル変数の値が上書きされてしまうという問題がありました。これは通常、開発者が意図しない挙動です。

この問題はPython 3で修正されました。リスト内包表記で使用した制御変数はスコープ外に漏れ出さないため、他のコード部分の変数値を汚染することなく、安心して同じ変数名を再利用できます。

#Python 2 のコード例

print 'Python', python_version()
i = 1
print 'before: i =', i
print 'comprehension: ', [i for i in range(5)]
print 'after: i =', i

実行結果

Python 2.7.6
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 4

上記の通り、Python 2では内包表記の実行後に変数iの値が「4」に書き換えられています。

#Python 3 のコード例

import sys
print('Python %s.%s.%s' %sys.version_info[:3])
i = 1
print('before: i =', i)
print('comprehension:', [i for i in range(5)])
print('after: i =', i)

実行結果

Python 3.6.1
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 1

Python 3では内包表記の実行後も変数iの値は「1」のまま維持され、意図しない副作用が発生しません。

まとめ

Python 2とPython 3には、print文・整数除算・Unicode対応・例外構文・変数スコープなど、多くの重要な違いがあります。Python 2はすでにサポート終了しているため、これから学習を始める方は迷わずPython 3を選びましょう。既存のPython 2コードを扱う場合も、本記事で紹介した違いを理解しておくことで、移行作業やトラブルシューティングが格段にスムーズになります。

  1. Windows XPとWindows 7の主な違い10選【アップグレード前に知っておきたい変更点】

    多くのユーザーがWindows Vistaを飛ばしてWindows XPを使い続けていた場合、Windows 7へのアップグレードは大きな変化として感じられるかもしれません。Microsoftの新型OSは、使いやすさ、利便性、そしてコンピューティング体験全体において、従来のWindowsから大きく進化を遂げています。 すべてが劇的な変更というわけではありませんが、ここではWindows XPとWindows 7の主な違いを10個ご紹介します。XPの操作方法に長年慣れ親しんできた方にとって、これらの変更点は重要に映るはずです。XPからWindows 7へのアップグレードを検討している方は、あらか

  2. Python 2.7.xとPython 3.xの主な違いとは?押さえておきたい5つのポイント

    Python 2系と3系の違いの背景 Python 3.0は2008年12月にリリースされました。これは、それ以前のバージョンに存在した設計上の課題を是正するために開発されたものです。Python 3の基本理念は「古い書き方を取り除き、機能の重複を減らす」というものでした。 ただし、Python 3.0には後方互換性がありません。つまり、Python 2.xの構文で書かれたプログラムは、そのままではPython 3.xのインタプリタ上で実行できません。なお、バージョン2.7はPython 2.xシリーズにおける最後のメジャーリリースとなっています。 両バージョンの間には数多くの違いがありますが