Python 2.xと3.xの違いについて

3.0バージョンのPythonは、Python 3000、または略してPy3kと呼ばれています。 以前のバージョンのPythonと比較すると、これはメジャーアップグレードです。

紛らわしさをもたらさない様に、今回は、完全な下位互換を持たない言語の大規模な改訂です。

以前のPythonバージョン用に設計された多くのプログラムは、Python3.0では正常に実行できません。

既存のプログラムを処理するために、臨時バージョンとしてのPython 2.6は、基本的にPython 2.xの構文とライブラリを使用しながら、Python 3.0への移行を検討して、Python3.0の構文と関数の一部を使用できるようになっています。

新しいPythonプログラムにはPython3.0構文を使用することをお勧めします。

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

ほとんどのサードパーティライブラリは、Python3.0バージョンとの互換性を保つために懸命に取り組んでいます。 Python 3.0をすぐに使用できない場合でも、Python 3.0と互換性のあるプログラムを作成してから、Python 2.6、Python2.7を使用して実行することをお勧めします。
Python 3.0での変更は、主に次になります。

print 函数

printステートメントはなくなり、print()関数に置き換えられました。 Python2.6およびPython2.7は、printステートメントの構文を部分的にサポートしています。 Python2.6とPython2.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)

Python2にはASCIIstr()タイプがあり、unicode()は別のタイプであり、 byteタイプではありません。

これで、Python 3では、ついにUnicode(utf-8)文字列と、byteクラス(byteおよびbytearray)ができました。

Python3.xソースコードファイルはデフォルトでutf-8エンコーディングを使用する。

>>> 日本 = 'Japan' 
>>>print(日本) 
Japan

Python 3.x

>>> str ="私はPythonが大好き"
>>> str
'私はPythonが大好き'

除算

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操作を実行します。これは、Python2.xとPython3.xで同じです。

python 2.x:

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

python 3.x:

>>> 1/2
0.5

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

python 3.x:

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

例外処理

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

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

構文(except (exc1, exc2) as varを使用して、複数のタイプの例外を同時にキャッチできます。 Python 2.6では、これら2つの構文をすでにサポートしています。

  • Python2.x時代では、すべてのタイプのオブジェクトを直接スローできます。Python3.x時代では、BaseException から継承されたオブジェクトのみをスローできます。
  • Python2のxraiseステートメントは、コンマを使用してオブジェクトタイプとパラメーターを区切ります。Python3.xは、この変な記述方法を削除しました。コンストラクター関数を直接呼び出してオブジェクトをスローします。

Python2.xの時代では、例外処理はコードでプログラムエラーを表現することに加えて、通常の制御構造が行うべきことを実行することがよくあります。Python3.xでは、エラーが発生した場合にのみ、設計者が例外でステートメントをキャッチして処理できます。例外処理がより具体的になります。

xrange

反復オブジェクトを作成するためのxrange()の使用は、Python2では非常に人気があります。 例えば、forループまたはリスト/集合/辞書の理解です。

これはジェネレーターのように動作します(例:「遅延評価」)。 しかし、このxrange-iterableは無限です。つまり、無限にトラバースできます。

遅延評価のため、xrange()関数は、1回だけトラバースする必要がある場合、range()よりも高速(例えば、ループなど)です。 ただし、1回繰り返す場合と比較して、ジェネレーターは毎回最初から開始するため、複数回繰り返すことはお勧めしません。

Python 3では、range()はxrange()のように実装されているため、専用のxrange()関数は存在しません(Python 3では、xrange()は名前付き例外をスローします)。

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

Python 2

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

Python 3

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
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

オクタル(8進数)リテラル表示

オクタル(8進数)は0o777と書く必要があり、元の形式0777は使用できません。バイナリ(2進数)は0b111と書く必要があります。

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

Python 3.xでは、オクタル(8進数)リテラルを表現する方法は1つしかなく、0o1000です。

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を使用する機会は少ないと思います。一般的にはデバッグ(debug)のみに使用され、ほとんどの場合、str関数は文字列でオブジェクトを記述するために使用されます。

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

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

古い名称新しい名称
_winregwinreg
ConfigParserconfigparser
copy_regcopyreg
Queuequeue
SocketServersocketserver
reprreprlib

StringIO モジュールが新しいioモジュールに組み込まれました。 new、md5、gopherlib およびその他のモジュールが削除されました。 Python 2.6は、すでに新しいioモジュールをサポートしています。

httplib、BaseHTTPServer、CGIHTTPServer、SimpleHTTPServer、Cookie、cookielibはhttpパッケージにマージされています。

execステートメントはキャンセルされ、exec()関数のみが残っています。 Python 2.6はすでにexec()関数をサポートしています。

データタイプ

1、Py3.Xはlong型を削除し、integer-intの型は1つだけになりましたが、 Python2.Xバージョンのlongのように動作します。

2、Python2.Xバージョンのオクテット文字列に対応するbytesタイプが新たに追加されました。bytesリテラルを定義する方法は次のとおりです。

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

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

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

3、dictの.keys()、. items、および.values()メソッドは反復子(イテレータ)を返し、以前のiterkeys()関数はすべて破棄されます。 また、dict.has_key()も同時に削除され、inに置き換えられます。

その他の変更

ファイルを開く

元は

file( ….. )

あるいは

open(…..)

代わりに

open(…..)のみ使用できる

キーボードから文字列を入力する

元は

raw_input( "プロンプト情報")

変更後は

input( "プロンプト情報")

python2.xでは raw_input()とinput()両方の関数が存在しますが、違いは次のとおりです。

raw_input()—すべての入力を文字列として扱い、文字列型を返します。
input()—–数字の入力のみを受け取ることができます。数字のみの入力を処理するときに特徴があり、入力した数字のタイプ(int、float)を返します。

python3.xでは、raw_input()とinput()が統合され、raw_input()が削除され、input()関数のみが保留されました。この関数は、任意の入力を受け取り、すべての入力をデフォルトで文字列として処理し、文字列型を返します。

map、filter 、 reduce

これらの3つの関数は、関数プログラミングの代表として知られています。 Python3.xとPython2.xの間にも大きな違いがあります。

まず、Python 2.xの対話モード(インタラクティブモード)でmapとfilterを入力するだけで、両方のタイプが built-in function(組み込み関数)であることがわかります。

>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>>

それらが出力する結果のタイプはすべてリストです。

>>> map(lambda x:x * 2、[1,2,3])
 [2、4、6]
 >>> filter(lambda x:x%2 == 0、range(10))
 [0、2、4、6、8] 
>>>

しかし、Python3.xでは次のようにはなります。

>>>map
<class 'map'>
>>> map(print、[1,2,3])
<map object at 0x10d8bd400>
>>>filter
<class 'filter'>
>>> filter(lambda x:x%2 == 0、range(10))
<filter object at 0x10d8bd3c8>
>>>

まず、関数からクラスに変更されました。次に、返される結果も元のリストから反復可能なオブジェクトに変更されました。next関数を使用して手動で反復しようとします。

>>> f = filter(lambda x:x%2 == 0、range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>

より上級なreduce関数については、Python 3.xには built-in に属しなく、functoolsモジュールに移動されました。

Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です