Heim >Backend-Entwicklung >Python-Tutorial >10 Hauptunterschiede zwischen Python2 und Python3

10 Hauptunterschiede zwischen Python2 und Python3

高洛峰
高洛峰Original
2016-10-19 16:26:581031Durchsuche

1. Leistung

Py3.0 führt den Pystone-Benchmark 30 % langsamer aus als Py2.5. Guido glaubt, dass Py3.0 großen Optimierungsspielraum bietet und gute Optimierungsergebnisse bei String- und Integer-Operationen erzielen kann.

2. Kodierung

Py3.0-Quellcodedateien verwenden standardmäßig die UTF-8-Kodierung, wodurch der folgende Code zulässig ist:

>>> China = 'china'

>>> print(中国)

china

3. Grammatik

1) entfernt und alles durch !=

ersetzt

2) Entfernen Sie „`“ und verwenden Sie repr() für alle

3) Fügen Sie as und with-Schlüsselwörter sowie True, False, None hinzu

4) Ganzzahldivision gibt Gleitkomma zurück Zahlen, um ganzzahlige Ergebnisse zu erhalten, verwenden Sie bitte //

5), um nichtlokale Anweisungen hinzuzufügen. Mit noclocal x können Sie periphere (nicht globale) Variablen direkt zuweisen

6) Entfernen Sie die print-Anweisung und fügen Sie die print()-Funktion hinzu, um dieselbe Funktion zu erreichen. Das Gleiche gilt für die exec-Anweisung, die in exec()

4 geändert wurde. Funktion

1) Die print-Anweisung wurde durch die Funktion print() ersetzt kann verwendet werden, um die alte print Special-Syntax zu ersetzen. Zum Beispiel:

Alt: print „Die Antwort ist“, 2*2

Neu: print(„Die Antwort ist“, 2*2)

Alt: print x , #Verwenden Sie Kommas am Ende, um Zeilenumbrüche zu verhindern

Neu: print(x, end=" ") # Verwenden Sie Leerzeichen, um Zeilen zu ersetzen

Alt: print # Neue Zeilen ausgeben

Neu: print() # Neue Zeile ausgeben

Alt: print >>sys.stderr, „fatal error“

Neu: print("fatal error", file=sys .stderr)

Alt: print (x, y) # Ausgabe repr((x, y))

Neu: print((x, y)) # Anders als print(x, y)!

2) Das Verhalten von sequentiellen Operatoren wie x

3) Eingabefunktion ändert sich jetzt:

Alt:

guess = int(raw_input('Geben Sie eine Ganzzahl ein: ')) #Methode zum Lesen von Tastatureingaben

Neu:

guess = int(input('Geben Sie eine Ganzzahl ein: '))

4) Entfernen Sie das Entpacken von Tupelparametern. Sie können die Funktion nicht wie folgt def(a, (b, c)): pass definieren

5) Neue oktale Wortvariable, die Funktion oct() wird entsprechend geändert. Die Methode für 2. >3.0 sieht so aus:

>>> 0666

SyntaxError: invalid token (, line 1)

>>> 0o666

438

>>> oct(438)

'0o666'

6) Binärliteral und bin()-Funktion

>>> bin hinzugefügt (438 )

'0b110110110'

>>> _438 = '0b110110110'

>>> _438

'0b110110110'

7 ) erweitertes iterierbares Entpacken. In Py3.0 sind a, b, *rest = seq und *rest, a = seq zulässig und erfordern nur zwei Punkte: rest ist ein Listenobjekt und seq ist iterierbar

8) New super() , können Sie keine Parameter mehr an super()

>>> class C(object):

def __init__(self, a):

print ('C.) übergeben ', a)

>>> class D(C):

def __init(self, a):

super().__init__(a) #Call super () ohne Parameter

>>> D(8)

C 8

9) Neue Metaklassensyntax

class Foo(*bases, **kwds):

pass

10) unterstützt den Klassendekorator. Die Verwendung ist die gleiche wie beim Funktionsdekorator:

<__main__.d>>>> 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()

Hallo,

Klassendekorateur kann verwendet werden, um den Trick zu spielen, die Zibetkatze in einen Prinzen zu verwandeln. Weitere Informationen finden Sie in PEP 3129

5. Strings und Byte-Strings

1) Jetzt gibt es nur noch einen String-Typ, str, aber dieser ist fast derselbe wie 2. x-Version von Unicode.

2) Informationen zu Byte-Strings finden Sie im 2. Punkt von „Datentyp“

6 Datentyp

1) Py3.0 hat den langen Typ entfernt. Jetzt gibt es nur einen Ganzzahltyp – int, aber er verhält sich wie long

in Version 2. Die Messmethode ist wie folgt:

>>> b = b'china'

>>> type(b)

3) str-Objekte und Bytes-Objekte können mithilfe von .encode() (str -> bytes) ineinander umgewandelt werden. oder .decode() (Bytes -> str) Methode

>>> s = b.decode()

>>> s

'china'


>>> b1 = s.encode()

>>> b1

b' china'

4) 1. Die .keys(), . Die Methoden items und .values() von dict geben Iteratoren zurück, während die vorherigen Funktionen iterkeys() und andere aufgegeben wurden. Ebenfalls entfernt wurde dict.has_key(), ersetzen Sie es durch in

7. 7. Objektorientiert

1) 1) Einführung abstrakter Basisklassen (ABCs).

2) Containerklassen und Iteratorklassen sind ABCs, daher gibt es im Cellections-Modul viel mehr Typen als in Py2.5

>>> Importsammlungen

>> > print('n'.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

Darüber hinaus haben numerische Typen auch die ABC-Größe. Zu diesen beiden Punkten siehe PEP 3119 und PEP 3141.

3) Die next()-Methode des Iterators wird in __next__() umbenannt und die integrierte Funktion next() wird hinzugefügt, um die __next__()-Methode des Iterators aufzurufen

4) @abstractmethod ist Hinzugefügt und @abstractproperty zwei Dekoratoren, ist es bequemer, abstrakte Methoden (Eigenschaften) zu schreiben

8 Ausnahmen

1) Ausnahmen werden also von BaseException und StardardError geerbt

2 wird gelöscht) Das Sequenzverhalten der Ausnahmeklasse und des .message-Attributs wurde entfernt

3) Verwenden Sie raise Exception(args) anstelle von raise Exception, args-Syntax

4) Ändern Sie die Syntax von Ausnahmen abfangen und als Schlüsselwörter zur Identifizierung von Ausnahmeinstanzen einführen, in Py2.5:

>>> try:

... raise NotImplementedError('Error')

... außer NotImplementedError , Fehler:

... print error.message

...

Fehler

in Py3.0:

>>> versuchen Sie:

erhöhen Sie NotImplementedError('Error')

außer NotImplementedError als Fehler: #Notieren Sie dies als

print(str(error) )

Fehler

5) Ausnahmekette, da __context__ in Version 3.0a1 nicht implementiert wurde, werden wir nicht über diesen Aspekt sprechen

9 Moduländerungen

• Das cPickle-Modul wurde entfernt und kann durch das Pickle-Modul ersetzt werden. Irgendwann werden wir ein transparentes und effizientes Modul haben.

• Imageop-Modul entfernt

• Audiodev, Bastion, bsddb185, Ausnahmen, Linuxaudiodev, MD5, MimeWriter, Mimify, Popen2, Rexec, Sets, Sha, Stringold, Strop, Sunaudiodev, Timing und entfernt xmllib-Module

• Das bsddb-Modul wurde entfernt (separat veröffentlicht, verfügbar unter http://www.jcea.es/programacion/pybsddb.htm)

• Das neue Modul wurde entfernt

• Die Funktionen os.tmpnam() und os.tmpfile() wurden in das tmpfile-Modul verschoben

• Das tokenize-Modul funktioniert jetzt mit Bytes. Der Haupteinstiegspunkt ist nicht mehr generic_tokens, sondern tokenize.tokenize()

10) xrange() wird in range() umbenannt. Um eine Liste zu erhalten, muss explizit aufgerufen werden:

>>> list(range(10))

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

2) Das Bytes-Objekt kann nicht hashen und unterstützt die Methoden b.lower(), b.strip() und b.split() nicht, aber für die beiden letztgenannten können Sie verwenden b.strip(b' ntrf' ) und b.split(b'') um den gleichen Zweck zu erreichen

3) zip(), map() und filter() geben alle Iteratoren zurück. Die Funktionen apply(), callable(), coerce(), execfile(), Reduce() und reload() wurden alle entfernt

4) string.letters und zugehörige .lowercase und .uppercase wurden entfernt , verwenden Sie stattdessen bitte string.ascii_letters

5) Wenn x

6) Mitglieder der __getslice__-Serie werden aufgegeben. a[i:j] wird in a.__getitem__(slice(I, j)) konvertiert oder __setitem__ und __delitem__ werden je nach Kontext aufgerufen

7) Die Dateiklasse ist in Py2.5 veraltet:

>>> Datei


In Py3.0:

>>> Datei

Traceback (letzter Aufruf last):

Datei "", Zeile 1, in

Datei

NameError: Name 'Datei' ist nicht definiert

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn