ホームページ >バックエンド開発 >Python チュートリアル >Python2 と Python3 の 10 の主な違い
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' はありません定義されました