Python 3とPython 2の違い

10346 ワード

Python 3とPython 2の違い
1.性能
Py3.0 pystone benchmarkを実行する速度比Py 2.5は30%遅い.GuidoはPy 3とする.0は極めて大きな最適化空間があり、文字列と整形操作で良好な最適化結果を得ることができる. Py3.1性能比Py 2.5は15%遅く、まだ大きなアップグレードスペースがあります.
2.コード化
Py3.Xソースファイルはutf-8符号化がデフォルトで使用され、以下のコードが合法的になります.
>>>    = 'china'
    >>>print(  )
    china

1
2
3
3.文法
1)<>を除去し、すべて改用!=2)除去」は、すべてrepr()3)キーワードをasとwithに加え、True,False,None 4)整数除算で浮動小数点数を返します.整数結果を得るには//5)を使用してnonlocal文を加えます.noclocal xを使用すると、周辺(非グローバル)変数6を直接割り当ててprint文を除去し、print()を加えます関数は同じ機能を実現します.同様にexec文もあり、exec()関数に変更されました.たとえば、2.X: print “The answer is”, 2*2 3.X: print(“The answer is”, 2*2) 2.X:print x,#カンマで終わる改行禁止3.X:print(x,end="")#改行2.X:print#出力新行3.X:print()#出力新行2.X:print>>sys.stderr、「fatal error」3.X: print(“fatal error”, file=sys.stderr) 2.X:print(x,y)#出力repr((x,y))3.X:print((x,y)#はprint(x,y)!7)順序オペレータの動作が変更され、例えばx
 >>> 0666
     438
     >>> oct(438)
     '0666'
   3.X  :
     >>> 0666
     SyntaxError: invalid token (#63>, line 1)
     >>> 0o666
     438
     >>> oct(438)
     '0o666'

1
2
3
4
5
6
7
8
9
10
11
11)2進数字面量とbin()関数を追加
>>> bin(438)
    '0b110110110'
    >>> _438 = '0b110110110'
    >>> _438
    '0b110110110'

1
2
3
4
5
12)拡張された反復可能な解包.Py 3.Xでは,a,b,*rest=seqと*rest,a=seqが合法であり,restがlistオブジェクトとseqが反復可能であることを2点だけ要求する.13)新しいsuper()は、super()にパラメータを渡さなくてもよい.
 >>> class C(object):
          def __init__(self, a):
             print('C', a)
    >>> class D(C):
          def __init(self, a):
             super().__init__(a) #      super()
    >>> D(8)
    C 8
    <__main__.d object="" at="" class="hljs-number">0x00D7ED90>

1
2
3
4
5
6
7
8
9
14)新しいmetaclass構文:class Foo(*bases,**kwds):pass 15)はclass decoratorをサポートします.関数decoratorと同様に使用します.
    >>> def foo(cls_a):
          def print_func(self):
             print('Hello, world!')
          cls_a.print = print_func
          return cls_a
    >>> @foo
    class C(object):
      pass
    >>> C().print()
    Hello, world!

1
2
3
4
5
6
7
8
9
10
class decoratorはタヌキを太子に変える大トリックに使うことができます.詳細については、PEP 3129を参照してください.
4.文字列とバイト列
1)文字列はstrの1種類しかありませんが、2.xバージョンのunicodeはほぼ同じです.
2)バイト列については、「データ型」の2番目の項目を参照してください.
5.データ型
1)Py3.Xはlongタイプを除いて、今は1つの整数型--intしかありませんが、その行為は2のようです.Xバージョンのlong 2)bytesタイプが2.Xバージョンの8ビット列で、bytesの字面量を定義する方法は以下の通りです.
>>> b = b'china'
    >>> type(b)
    <type 'bytes'>

1
2
3
strオブジェクトとbytesオブジェクトは使用できる.encode() (str -> bytes) or .decode()法(bytes->str)法は相互に変換される.
>>> s = b.decode()
    >>> s
    'china'
    >>> b1 = s.encode()
    >>> b1
    b'china'

1
2
3
4
5
6
3)dictの.keys()、.itemsと.values()メソッドは反復器を返し,以前のiterkeys()などの関数は廃棄された.同時に取り除いたのはdict.has_ですkey()は、inで代用しましょう
6.オブジェクト向け
1)抽象ベースクラス(Abstraaact Base Classes,ABCs)を導入する.2)容器類と反復器類はABCs化されているのでcellectionsモジュールのタイプはPy 2よりも大きい.5多すぎます.
>>> import collections
    >>> print('
'
.join(dir(collections))) Callable Container Hashable ItemsView Iterable Iterator KeysView Mapping MappingView MutableMapping MutableSequence MutableSet NamedTuple Sequence Set Sized ValuesView __all__ __builtins__ __doc__ __file__ __name__ _abcoll _itemgetter _sys defaultdict deque

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
また、数値タイプもABCs化されている.この点については、PEP 3119およびPEP 3141を参照してください.3)反復器のnext()メソッドをnext()と改名し,反復器を呼び出すためのnext()を追加し,@abstractmethodと@abstractpropertyの2つのdecoratorを追加し,抽象メソッド(属性)を記述するのがより便利になった.
7.異常
1)したがって異常はすべてBaseExceptionから継承する、StardardError 2を削除する)異常クラスのシーケンス挙動とを除去する.Message属性3)raise Exception,args構文4)の代わりにraise Exception(args)を用いて異常の構文変更をキャプチャし,Py 2においてasキーワードを導入して異常インスタンスを識別する.5:
  >>> try:
    ...    raise NotImplementedError('Error')
    ... except NotImplementedError, error:

    ...    print error.message
    ...
    Error    

1
2
3
4
5
6
7
Py 3.0:
 >>> try:
          raise NotImplementedError('Error')
        except NotImplementedError as error: #     as
          print(str(error))
    Error

1
2
3
4
5
5)contextは3.0 a 1バージョンで実装されていないため、異常チェーン
8.モジュール変動
1)cPickleモジュールを除去し,pickleモジュールで代用できる.最終的には、透明で効率的なモジュールがあります.2)imageopモジュールを除去3)audiodev,Bastion,bsddb 185,exceptions,linuxaudiodev,md 5,MimeWriter,mimify,popen 2,rexec,sets,sha,stringold,strop,sunaudiodev,timing,xmllibモジュール4)を除去したbsddbモジュール(単独で公開可能、http://www.jcea.es/programacion/pybsddb.htm取得)5)newモジュール6)osを除去する.tmpnam()とos.tmpfile()関数は、tmpfileモジュールの下7)tokenizeモジュールに移動され、bytesを使用して動作します.主なエントリポイントはgenerateではありませんtokensではなくtokenize.tokenize()
9.その他
1)xrange()はrange()と名前を変更し、range()を使用してlistを取得するには、明示的に呼び出す必要があります.
>>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

1
2
2)bytesオブジェクトはhashではなく、b.lower()、b.strip()およびb.split()メソッドもサポートされていませんが、後者についてはb.strip(b’trf’)およびb.split(b’’’)を使用して、同じ目的3)zip()、map()、filter()の両方を反復器に戻すことができます.apply()、callable()、coerce()、execfile()、reduce()、reload()関数は除去されました
callable()をhasattr()で置き換えることができる.hasattr()の構文は、hasattr(string,‘name’)のようになります.
4)string.lettersは関連しています...uppercaseが除去されましたstringに変更してください.ascii_lettersら5)x>>> file <type 'file'>
1
2
Py 3.X:
 >>> file
    Traceback (most recent call last):
    File "", line 1, in 
       file
    NameError: name 'file' is not defined