Heim > Artikel > Backend-Entwicklung > 10 Hauptunterschiede zwischen Python2 und Python3
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 !=
ersetzt2) 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 Metaklassensyntaxclass Foo(*bases, **kwds):pass10) 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