Python2.x と 3.x バージョンの違い

Python の 3.0 バージョンは、Python 3000 とも呼ばれ、略して Py3k とも呼ばれます。Python の初期バージョンと比較して、これは大きなアップグレードです。

余計な負担を持ち込まないように、Python 3.0 は設計時に下位互換性を考慮していません。

初期の Python バージョン向けに設計された多くのプログラムは、Python 3.0 では正常に実行できません。

既存のプログラムに配慮して、Python 2.6 は移行バージョンとして、基本的に Python 2.x の構文とライブラリを使用し、Python 3.0 への移行を考慮して、一部の Python 3.0 の構文と関数を使用できるようにしました。

新しい Python プログラムでは Python 3.0 バージョンの構文を使用することをお勧めします。

実行環境に Python 3.0 をインストールできないか、プログラム自体が Python 3.0 をサポートしていないサードパーティライブラリを使用している場合を除きます。現在 Python 3.0 をサポートしていないサードパーティライブラリには、Twisted、py2exe、PIL などがあります。

ほとんどのサードパーティライブラリは Python 3.0 バージョンと互換性を持たせるために努力しています。すぐに Python 3.0 を使用できない場合でも、Python 3.0 バージョンと互換性のあるプログラムを作成し、Python 2.6、Python 2.7 を使用して実行することをお勧めします。

Python 3.0 の変更点は主に以下のとおりです。


print 関数

print 文はなくなり、代わりにprint()関数になりました。Python 2.6 と Python 2.7 はこの形式の print 構文を部分的にサポートしています。Python 2.6 と Python 2.7 では、以下の3つの形式は同等です。

print "fish"
print ("fish") # 注意print后面有个空格
print("fish") # print()不能带有任何其它参数

ただし、Python 2.6 は実際には新しい print() 構文をすでにサポートしており、例は次のとおりです。

from __future__ import print_function
print("fish", "panda", sep=', ')

Python2.x バージョンで Python3.x の print 関数を使用したい場合は、インポートできます。__future__パッケージ。このパッケージは Python2.x の print 文を無効にし、Python3.x の print 関数を採用します:

例

>>> list =["a", "b", "c"]
>>> print list    # python2.x の print 文
['a', 'b', 'c']
>>> from __future__ import print_function  # __future__ パッケージをインポート
>>> print list     # Python2.x の print 文は無効になり、使用するとエラーになります
  File "<stdin>", line 1
    print list
             ^
SyntaxError: invalid syntax
>>> print (list)   # Python3.x の print 関数を使用
['a', 'b', 'c']
>>>

Python3.x と Python2.x の多くの互換性設計機能は、__future__このパッケージをインポートすることで利用できます。


Unicode

Python 2 には ASCII の str() 型があり、unicode() は独立しており、byte 型ではありません。

現在、Python 3 では、ついに Unicode (utf-8) 文字列と、バイトクラス: byte と bytearrays を手に入れました。

Python3.x のソースファイルはデフォルトで utf-8 エンコーディングを使用するため、中国語の使用がより便利になりました:

>>> 中国 = 'china' 
>>>print(中国) 
china

Python 2.x

>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
>>> str = u"我爱北京天安门"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

Python 3.x

>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'

除算

Python の除算は他の言語と比べて非常に高度で、複雑な一連の規則があります。Python の除算には2つの演算子があります。/と//

まず、/除算:

Python 2.x では/除算は、Java や C など私たちがよく知っている多くの言語と同様に、整数同士の除算の結果は整数になり、小数部分は完全に無視されます。浮動小数点数の除算は小数点以下を保持し、浮動小数点数の結果になります。

Python 3.x では/除算はそのようには行われず、整数同士の除算でも結果は浮動小数点数になります。

Python 2.x:

>>> 1 / 2
0
>>> 1.0 / 2.0
0.5

Python 3.x:

>>> 1/2
0.5

一方、//// 除算は floor 除算と呼ばれ、除算の結果に対して自動的に floor 操作を行います。Python 2.x と Python 3.x で一貫しています。

python 2.x:

>>> -1 // 2
-1

python 3.x:

>>> -1 // 2
-1

注意すべき点は、小数部分を切り捨てるのではなく、floor 操作を実行することです。整数部分を切り取りたい場合は、math モジュールの trunc 関数を使用する必要があります。

python 3.x:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0

例外

Python 3 では例外処理も少し変更されました。Python 3 では、現在 as をキーワードとして使用します。

例外をキャッチする構文は、except exc, varに変更されましたexcept exc as var。

構文 except (exc1, exc2) as var を使用すると、複数の種類の例外を同時にキャッチできます。Python 2.6 はすでにこの両方の構文をサポートしています。

  • 1. 2.x 時代では、あらゆる型のオブジェクトを直接投げることができましたが、3.x 時代では、BaseException を継承したオブジェクトのみが投げられます。
  • 2. 2.x の raise 文はカンマを使用して投げるオブジェクトの型と引数を区切っていましたが、3.x ではこの奇妙な書き方は廃止され、直接コンストラクタを呼び出してオブジェクトを投げるだけです。

2.x 時代では、例外はプログラムのエラーを表すだけでなく、通常の制御構造が行うべきこともよく行っていました。3.x では、設計者が例外をより特化させ、エラーが発生した場合にのみ例外キャッチ文を使用して処理できるようにしたことがわかります。

Python 2.x: 例外処理構文はカンマを使用します。

try:
    # code
except Exception, e:
    print e

Python 3.x: 例外処理構文は as を使用します。

try:
    # code
except Exception as e:
    print(e)

xrange() と range()

Python 2.x: range() はリストを返し、xrange() はジェネレータを返します(メモリをより節約できます)。

range(5)  # 返回 [0, 1, 2, 3, 4]
xrange(5)  # 返回 xrange 对象,按需生成数字

Python 3.x: xrange() は削除され、range() はジェネレータを返すため、メモリを節約できます。

range(5)  # 返回一个迭代器,按需生成数字

8進数リテラル表記

8進数は 0o777 と書かなければならず、以前の形式 0777 は使用できません。2進数は0b111。

新たに追加されたbin()関数は整数を2進数文字列に変換するために使用されます。Python 2.6 はすでにこの両方の構文をサポートしています。

Python 3.x では、8進数リテラルを表す方法は 0o1000 の1つだけです。

python 2.x

>>> 0o1000
512
>>> 01000
512

python 3.x

>>> 01000
  File "<stdin>", line 1
    01000
        ^
SyntaxError: invalid token
>>> 0o1000
512

不等号演算子

Python 2.x では、等しくないには != と <> の2つの書き方があります。

Python 3.x では <> が削除され、!= のみの書き方になりました。幸い、私は <> を使う習慣はありません。


repr式 `` の削除

Python 2.x では、バッククォート `` は repr 関数と同じ役割を果たします。

Python 3.x では `` という書き方は削除され、repr 関数のみを使用できます。これはコードをより明確に見せるためでしょうか?しかし、repr を使う機会はめったになく、通常はデバッグのときだけ使い、ほとんどの場合は str 関数を使ってオブジェクトを文字列で記述します。

def sendMail(from_: str, to: str, title: str, body: str) -> bool:
    pass

複数のモジュールが改名されました(PEP8に基づく)

古い名前 新しい名前
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib

StringIO モジュールは新しい io モジュールに統合されました。new、md5、gopherlib などのモジュールは削除されました。Python 2.6 はすでに新しい io モジュールをサポートしています。

httplib、BaseHTTPServer、CGIHTTPServer、SimpleHTTPServer、Cookie、cookielib は http パッケージに統合されました。

exec 文は廃止され、exec() 関数のみが残りました。Python 2.6 はすでに exec() 関数をサポートしています。


5. データ型

1)Py3.X では long 型が削除され、現在は int という1つの整数型のみがありますが、その動作は 2.X バージョンの long と同様です。

2)bytes 型が新たに追加されました。2.X バージョンの8ビット文字列に相当します。bytes リテラルを定義する方法は次のとおりです。

>>> b = b'china' 
>>> type(b) 
<type 'bytes'> 

str オブジェクトと bytes オブジェクトは .encode() (str -> bytes) または .decode() (bytes -> str) メソッドを使用して相互に変換できます。

>>> s = b.decode() 
>>> s 
'china' 
>>> b1 = s.encode() 
>>> b1 
b'china' 

3)dict の .keys()、.items と .values() メソッドはイテレータを返しますが、以前の iterkeys() などの関数は廃止されました。同時に dict.has_key() も削除されました。代わりに in を使用しましょう。


6. 標準ライブラリの再編成

Python 3.x: 一部のモジュールは再編成または改名されました。例えば、urllib、urlparse は urllib に統合されました。

# Python 2.x
import urllib
import urlparse

# Python 3.x
import urllib.parse

7. 関数の iteritems() と items()

Python 2.x: 辞書には items() と iteritems() メソッドがあり、items() はリストを返し、iteritems() はイテレータを返します。

d = {'a': 1, 'b': 2}
d.items()     # 返回 [('a', 1), ('b', 2)]
d.iteritems()  # 返回字典的迭代器

Python 3.x: iteritems() は削除され、items() は辞書ビュー(つまりイテレータ)を返します。

d = {'a': 1, 'b': 2}
d.items()     # 返回 dict_items([('a', 1), ('b', 2)])

8. モジュールの __future__ サポート

Python 3.x: Python 2.x の多くの機能はすでに削除されており、Python 2.x ユーザーがコード内で Python 3.x の動作を先取りして使用したい場合は、__future__ インポートを使用して互換性を実現できます。

from __future__ import print_function

9. 辞書のソート

Python 2.x: 辞書は順序なし(順序が保証されていません)です。

Python 3.x: 辞書は順序付けされ、挿入順に要素が保持されます。

10. next() メソッド

Python 2.x: next() は関数であり、通常 iter() と一緒に使用されます。

Python 3.x: next() は組み込み関数であり、使い方は Python 2.x と同じですが、引数が異なります。Python 3.x では next(iterator, default) によってデフォルト値を設定できます。

その他の拡張