ホームページ  >  記事  >  バックエンド開発  >  Python2 と Python3 の 10 の主な違い

Python2 と Python3 の 10 の主な違い

高洛峰
高洛峰オリジナル
2016-10-19 16:26:581011ブラウズ

1. パフォーマンス

Py3.0 は pystone ベンチマークを Py2.5 よりも 30% 遅く実行します。 Guido 氏は、Py3.0 には最適化の余地が大きく、文字列演算と整数演算で良好な最適化結果を達成できると考えています。

2. エンコーディング

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

>>>>China = 'china'

>>> print (China)

china

3. 文法

1) を削除して !=

​​ を使用します 2) `` を削除してすべてに repr() を使用します

3) True、False、None と同様に as および with キーワードを追加します

4) 整数の除算は浮動小数点数を返します。整数の結果を取得するには、//

を使用してください。5) 非ローカルなステートメントを追加します。 noclocal x を使用して周辺 (非グローバル) 変数を直接割り当てます

6) print ステートメントを削除し、同じ機能を実現するために print() 関数を追加します。 exec ステートメントも同様で、exec() に変更されました

4. 関数

1) print ステートメントは print() 関数に置き換えられました。キーワード パラメーターを使用して、古い print スペシャルを置き換えることができます。構文。例:

旧: print "答えは", 2*2

新: print("答えは", 2*2)

旧: print x, #行を無効にするには最後にカンマを使用しますBreaks

New: print (x, end=" ") # スペースを使用して行を置き換えます

Old: print # 新しい行を出力します

New: print() # 新しい行を出力します

Old: print >>sys.stderr 、「致命的なエラー」

新: print("致命的なエラー", file=sys.stderr)

旧: print (x, y) # 出力 repr((x, y))

新: print((x , y)) # print(x, y) とは異なります!

2) x

3) 入力関数の変更 現在:

旧:

guess = int(raw_input('整数を入力 : ')) #キーボード入力の読み方

新:

guess = int(input('整数を入力: '))

4) タプルパラメータのアンパックを削除します。この関数は def(a, (b, c)):pass のように定義することはできません

5) 新しい 8 進ワード変数、oct() 関数はそれに応じて変更されました。 2.x の方法は次のとおりです

>>> 0666

438

>>> oct(438)

'0666'

3.0 は次のようになります:

>>> 0666

SyntaxError: valid token (, line 1 )

>>> 0o666

438

>>> oct(438)

'0o666'

6) バイナリリテラルとbin()関数を追加しました

>>> bin(438)

'0b110110110'

>>> _438 = '0b110110110'

>>> _438

'0b110110110'

7) 拡張された反復可能なアンパック。 Py3.0 では、a、b、*rest = seq および *rest、a = seq は正当であり、2 つの点だけが必要です:rest はリスト オブジェクトであり、seq は反復可能です

8) New 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)

8

<__main__.d>9) 新しいメタクラス構文

class Foo(*bases, **kwds):

pass

10) はクラス デコレータをサポートします。使用法は関数デコレータと同じです:

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

こんにちは、

クラスデコレータを使用してジャコウネコを変更するトリックを行うことができます王子様に猫。詳細については、PEP 3129

5、文字列とバイト文字列

1) を参照してください。1) 文字列には str という 1 つのタイプしかありませんが、これは Unicode の 2.x バージョンとほぼ同じです。

2) バイト文字列については、「データ型」の 2 番目の項目を参照してください。

6. データ型

1) Py3.0 では、long 型が削除され、整数型は int の 1 つだけになりました。バージョン 2.x では、long のように動作します

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

>>> b = b'china'

>>> type(b)


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

> >> s = b.decode()

>>> s

'中国'

>>> b1 = s.encode()

>>> b1

b'china'

4) 1. dict 戻り反復子の .keys()、.items、および .values() メソッドは、以前の iterkeys() およびその他の関数は廃止されました。 dict.has_key() も削除され、in

7, 7 に置き換えられます。 オブジェクト指向

1) 1) 抽象基本クラス (抽象基本クラス、ABC) を導入します。

2) コンテナクラスとイテレータクラスはABCなので、cellectionsモジュールにはPy2.5よりも多くの型があります

>>> import collections

>>> print('n'.join(dir(collections) )))

Callable

Container

Hashable

ItemsView

Iterable

Iterator

KeysView

Mapping

MappingView

MutableMapping

MuテーブルSequence

MutableSet

NamedTuple

Sequence

Set

サイズ付き

ValuesView

__all__

__builtins__

__doc__

__file__

__name__

_abcoll

_itemgetter

_sys

defaultdict

deque

さらに、数値型も ABC サイズになります。これら 2 つの点については、PEP 3119 および PEP 3141 を参照してください。

3) イテレータの next() メソッドの名前が __next__() に変更され、イテレータの __next__() メソッドを呼び出すための組み込み関数 next() が追加されます

4) 2 つのデコレータ、@abstractmethod と @abstractproperty、が追加されている場合は、抽象メソッド (プロパティ) を記述する方が便利です

8. 例外

1) したがって、例外は BaseException から継承され、StardardError は削除されます

2) 例外クラスのシーケンス動作と .message 属性は、削除されました

3) raise Exception, args 構文の代わりに raise Exception(args) を使用します

4) 例外をキャッチするための構文が変更され、Py2.5 では例外インスタンスを識別するために as キーワードが導入されました:

>>> try:

... NotImplementedError ('Error') を発生させます

... NotImplementedError を除く、error:

... Py3.0 の error.message

...

Error

を出力します:

>>> try:

raise NotImplementedError('Error')

エラーとして NotImplementedError を除く: #__context__ がバージョン 3.0 では実装されていないため、

print(str(error))

Error

5) 例外チェーンとして注意してください。 a1、これについては話しません

9. モジュールの変更点

• cPickle モジュールは削除され、pickle モジュールに置き換えることができます。最終的には、透過的で効率的なモジュールが完成するでしょう。

• imageop モジュールを削除しました

• audiodev、Bastion、bsddb185、例外、linuxaudiodev、md5、MimeWriter、mimify、popen2、rexec、sets、sha、stringold、strop、sunaudiodev、timing および xmllib モジュールを削除しました

• bsddb を削除しましたモジュール (個別にリリースされ、http://www.jcea.es/programacion/pybsddb.htm から入手可能)

• 新しいモジュールを削除しました

• os.tmpnam() および os.tmpfile( ) 関数は、 tmpfile モジュール

• tokenize モジュールはバイトを扱うようになりました。メインのエントリ ポイントは、generate_tokens ではなくなりましたが、tokenize.tokenize()

10、その他

1) xrange() の名前が range() に変更されました。 range() を使用してリストを取得する場合は、呼び出す必要があります。明示的に:

>>> list(range(10))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2) bytes オブジェクトはハッシュできません。 b. lower( )、b.strip()、b.split() メソッドをサポートしていますが、後の 2 つのメソッドについては、 b.strip(b' ntrf') と b.split(b' ') を使用して実現できます。同じ目的です

3) zip( )、map()、および filter() はすべてイテレータを返します。 apply()、callable()、coerce()、execfile()、reduce()、reload() 関数はすべて削除されました

4) string.letters と関連する . lowercase と .uppercase は削除されました。代わりに使用してください。 string.ascii_letters など

5) x

6) __getslice__ シリーズのメンバーは放棄されます。 a[i:j] は a.__getitem__(slice(I, j)) に変換されるか、コンテキストに従って __setitem__ と __delitem__ が呼び出されます

7) ファイル クラスは Py2.5 では非推奨です:

>>> Py3.0 の file


:

>>> file

トレースバック (最新の呼び出し最後):

ファイル ""、行 1、

ファイル内

NameError: 名前 'file' はありません定義されました


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。