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=', ')

Unicode

Python 2 には ASCII str() タイプ、unicode() があります。バイト型ではなくシングルです。

さて、Python 3 では、ついに Unicode (utf-8) 文字列と、バイト クラス: byte および bytearrays が追加されました。


Python3.X ソース コード ファイルはデフォルトで utf-8 エンコーディングを使用するため、次のコードが合法になります:

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

Python 2. Python の部門は他の言語と比較して非常にハイエンドであり、非常に複雑なルールのセット。 Python の除算には、/ と //

という 2 つの演算子があります。まず、/division:


Python 2.x では、/division は Java や C など、私たちが使い慣れているほとんどの言語に似ています。除算の結果は整数となり、小数部は完全に無視されます。浮動小数点除算では小数部が保持され、浮動小数点の結果が得られます。

Python 3.x/division では、整数間の除算ではこれが行われなくなり、結果も浮動小数点数になります。

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
'我爱北京天安门'

//division の場合、この除算はフロア除算と呼ばれ、Python 2.x と Python では除算の結果に対してフロア演算が自動的に実行されます。 3 .x は一貫性があります。

python 2.x:

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

python 3.x:

>>> 1/2
0.5

小数部分は切り捨てられませんが、切り捨て演算が実行されることに注意してください。小数部分を切り取りたい場合は、trunc 関数を使用する必要があります。 math モジュールの

python 3.x:

>>> -1 // 2
-1

Exceptions

例外処理も Python 3 では若干変更されました。Python 3 では、キーワードとして as を使用するようになりました。

例外をキャッチするための構文が、

excex, var
から

excex as var

に変更されました。

複数の例外カテゴリを同時にキャッチするには、var として (exc1, exc2) 以外の構文を使用します。 Python 2.6 はすでに両方の構文をサポートしています。

  • 1. 2.x 時代では、すべての種類のオブジェクトを直接スローできます。3.x 時代では、BaseException を継承するオブジェクトのみをスローできます。

  • 2. 2.x の raise ステートメントは、スローされるオブジェクトの型とパラメーターを区切るためにカンマを使用します。3.x では、この奇妙な書き込みメソッドがキャンセルされ、オブジェクトをスローするコンストラクターが直接呼び出されます。


2.の具体的な例外キャッチステートメントは、エラーが発生した場合にのみ使用できます。


xrange

Python 2 では、反復可能なオブジェクトを作成するための xrange() の使用が非常に一般的です。例: for ループまたはリスト/セット/辞書の内包表記。

これはジェネレーター (つまり、「遅延評価」) と非常によく似た動作をします。しかし、この xrange-iterable は無限であり、無限に走査できることを意味します。

その遅延評価により、(for ループのように) 1 回だけ反復する必要がある場合、xrange() 関数は range() よりも高速です。ただし、ジェネレーターは毎回最初から開始されるため、1 回反復するのではなく、複数回反復することはお勧めしません。

Python 3 では、range() は xrange() と同様に実装されるため、専用の xrange() 関数は存在しなくなりました (Python 3 では、xrange() は名前付き例外をスローします)。

>>> -1 // 2
-1

Python 2

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

Python 3

import timeit

n = 10000
def test_range(n):
    return for i in range(n):
        pass

def test_xrange(n):
    for i in xrange(n):
        pass
print 'Python', python_version()

print '\ntiming range()' 
%timeit test_range(n)

print '\n\ntiming xrange()' 
%timeit test_xrange(n)

Python 2.7.6

timing range()
1000 loops, best of 3: 433 µs per loop


timing xrange()
1000 loops, best of 3: 350 µs per loop

8進数リテラル表現

8進数は0o777として記述する必要があり、元の形式の0777は使用できません。2進数は0b111として記述する必要があります。

整数をバイナリ文字列に変換する新しい bin() 関数が追加されました。 Python 2.6 はすでに両方の構文をサポートしています。

Python 3.x では、8 進リテラルを表す方法は 0o1000 しかありません。

Python 2. <> では、!= を記述する方法は 1 つだけです。幸いなことに、私は Python 2.x の

Repr 式 ``

Backticks`` を使用したことがありません。 repr 関数へ

Python 3.x の関数では ` という記述方法が削除され、repr 関数のみが使用できるようになりました。これはコードをわかりやすくするためでしょうか。ただし、repr を使用する機会は非常に少ないと感じます。通常は、文字列を使用してオブジェクトを記述するために str 関数が使用されることがほとんどです。

print('Python', python_version())

print('\ntiming range()')
%timeit test_range(n)

Python 3.4.1

timing range()
1000 loops, best of 3: 520 µs per loop

複数のモジュールの名前が変更されました (PEP8 に従って)

古い名前

新しい名前

_winregwinregConfigParserconfigパーサー copy_regcopyreg キューキューソケットサーバーソケットサーバーreprreprlib

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、バージョン 2 のオクテット文字列に対応します。 > str) メソッドは相互に変換されます。

print(xrange(10))
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-5d8f9b79ea70> in <module>()
----> 1 print(xrange(10))

NameError: name 'xrange' is not defined

3) dict の .keys()、.items、および .values() メソッドは反復子を返しますが、以前の iterkeys() およびその他の関数は放棄されました。また、削除されたのは、 dict.has_key() を in に置き換えます。