Unterschiede zwischen Python 2.x und 3.x
Python 3.0, oft als Python 3000 oder einfach Py3k bezeichnet, ist ein großes Upgrade gegenüber früheren Versionen von Python.
Um nicht zu viel Ballast mitzuschleppen, wurde Python 3.0 ohne Berücksichtigung der Abwärtskompatibilität entworfen.
Viele Programme, die für frühere Python-Versionen entwickelt wurden, können unter Python 3.0 nicht ordnungsgemäß ausgeführt werden.
Um vorhandene Programme zu unterstützen, dient Python 2.6 als Übergangsversion, die im Wesentlichen die Syntax und Bibliotheken von Python 2.x verwendet und gleichzeitig die Migration zu Python 3.0 berücksichtigt, wodurch die Nutzung einiger Syntax- und Funktionselemente von Python 3.0 ermöglicht wird.
Für neue Python-Programme wird empfohlen, die Syntax von Python 3.0 zu verwenden.
Es sei denn, die Ausführungsumgebung kann Python 3.0 nicht installieren oder das Programm selbst verwendet Bibliotheken von Drittanbietern, die Python 3.0 nicht unterstützen. Derzeit gehören zu den Bibliotheken von Drittanbietern, die Python 3.0 nicht unterstützen, Twisted, py2exe, PIL usw.
Die meisten Bibliotheken von Drittanbietern sind bestrebt, mit Python 3.0 kompatibel zu sein. Selbst wenn Sie Python 3.0 nicht sofort verwenden können, wird empfohlen, Programme zu schreiben, die mit Python 3.0 kompatibel sind, und sie dann mit Python 2.6 oder Python 2.7 auszuführen.
Die Änderungen in Python 3.0 betreffen hauptsächlich folgende Aspekte:
print-Funktion
Die print-Anweisung ist verschwunden und wurde durch dieprint()-Funktion ersetzt. Python 2.6 und Python 2.7 unterstützen diese Form der print-Syntax teilweise. In Python 2.6 und Python 2.7 sind die folgenden drei Formen äquivalent:
print "fish"
print ("fish") # 注意print后面有个空格
print("fish") # print()不能带有任何其它参数
Python 2.6 unterstützt jedoch bereits die neue print()-Syntax, zum Beispiel:
from __future__ import print_function
print("fish", "panda", sep=', ')
Wenn Sie die Python 3.x print-Funktion in Python 2.x verwenden möchten, können Sie das__future__-Paket importieren, das die Python 2.x print-Anweisung deaktiviert und die Python 3.x print-Funktion übernimmt:
Beispiel
>>> print list # print-Anweisung in Python2.x
['a', 'b', 'c']
>>> from __future__ import print_function # Import des __future__-Pakets
>>> print list # Die print-Anweisung von Python2.x ist deaktiviert; ihre Verwendung verursacht einen Fehler
Datei "<stdin>", Zeile 1
print list
^
SyntaxError: ungültige Syntax
>>> print (list) # Verwende die print-Funktion von Python3.x
['a', 'b', 'c']
>>>
Viele Kompatibilitätsmerkmale zwischen Python3.x und Python2.x können über__future__dieses Paket importiert werden.
Unicode
Python 2 hat einen ASCII-Typ str(), und unicode() ist separat, kein Byte-Typ.
Jetzt haben wir in Python 3 endlich Unicode-Strings (utf-8) und eine Byte-Klasse: bytes und bytearrays.
Da Python3.x-Quelldateien standardmäßig utf-8-Kodierung verwenden, ist die Verwendung von Chinesisch bequemer:
>>> 中国 = 'china' >>>print(中国) china
Python 2.x
>>> str = "我爱北京天安门" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我爱北京天安门" >>> str u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'
Python 3.x
>>> str = "我爱北京天安门" >>> str '我爱北京天安门'
Divisionsoperation
Die Division in Python scheint im Vergleich zu anderen Sprachen sehr ausgefeilt zu sein, mit einem komplexen Regelwerk. Es gibt zwei Operatoren für die Division in Python:/und//
Zuerst sprechen wir über/Division:
In Python 2.x ist/Division wie in den meisten Sprachen, mit denen wir vertraut sind, z. B. Java und C: Ganzzahldivision ergibt eine Ganzzahl und ignoriert den Bruchteil vollständig, während Gleitkommadivision den Dezimalteil beibehält und ein Gleitkommaergebnis liefert.
In Python 3.x macht/Division das nicht mehr; das Ergebnis der Division von Ganzzahlen ist ebenfalls ein Float.
Python 2.x:
>>> 1 / 2 0 >>> 1.0 / 2.0 0.5
Python 3.x:
>>> 1/2 0.5
Was die//Division betrifft, diese Art der Division wird Floor-Division genannt. Sie führt automatisch eine Floor-Operation mit dem Ergebnis der Division durch, und sie ist in Python 2.x und Python 3.x konsistent.
python 2.x:
>>> -1 // 2 -1
python 3.x:
>>> -1 // 2 -1
Beachten Sie, dass sie den Bruchteil nicht verwirft, sondern eine Floor-Operation durchführt. Wenn Sie den ganzzahligen Teil abschneiden möchten, müssen Sie die Funktion trunc aus dem math-Modul verwenden.
python 3.x:
>>> import math >>> math.trunc(1 / 2) 0 >>> math.trunc(-1 / 2) 0
Ausnahmen
Auch die Ausnahmebehandlung hat sich in Python 3 leicht geändert. In Python 3 verwenden wir jetzt 'as' als Schlüsselwort.
Die Syntax zum Abfangen von Ausnahmen änderte sich vonexcept exc, varzuexcept exc as var。
Mit der Syntax 'except (exc1, exc2) as var' können mehrere Ausnahmetypen gleichzeitig abgefangen werden. Python 2.6 unterstützt bereits beide Syntaxen.
- 1. In der 2.x-Ära konnten alle Arten von Objekten direkt geworfen werden. In der 3.x-Ära können nur von BaseException abgeleitete Objekte geworfen werden.
- 2. In 2.x verwendete die raise-Anweisung ein Komma, um den geworfenen Objekttyp und das Argument zu trennen. 3.x entfernte diese seltsame Syntax; man kann einfach den Konstruktor aufrufen, um ein Objekt auszulösen.
In der 2.x-Ära wurden Ausnahmen neben der Anzeige von Programmfehlern oft für Dinge verwendet, die gewöhnliche Kontrollstrukturen erledigen sollten. In 3.x kann man sehen, dass die Designer Ausnahmen spezifischer gemacht haben; Anweisungen zur Ausnahmebehandlung sollten nur verwendet werden, wenn Fehler auftreten.
Python 2.xDie Syntax zur Ausnahmebehandlung verwendet ein Komma.
try:
# code
except Exception, e:
print ePython 3.xDie Syntax zur Ausnahmebehandlung verwendet 'as'.
try:
# code
except Exception as e:
print(e)
xrange() und range()
Python 2.xrange() gibt eine Liste zurück, während xrange() einen Generator zurückgibt (speichereffizienter).
range(5) # 返回 [0, 1, 2, 3, 4] xrange(5) # 返回 xrange 对象,按需生成数字
Python 3.xxrange() wurde entfernt, und range() gibt einen Generator zurück, wodurch Speicher gespart wird.
range(5) # 返回一个迭代器,按需生成数字
Darstellung von Oktalliteralen
Oktalzahlen müssen als 0o777 geschrieben werden; die alte Form 0777 kann nicht mehr verwendet werden; Binärzahlen müssen geschrieben werden als0b111。
Einebin()-Funktion wurde hinzugefügt, um eine Ganzzahl in eine binäre Zeichenkette umzuwandeln. Python 2.6 unterstützt bereits beide Syntaxen.
In Python 3.x gibt es nur eine Möglichkeit, ein Oktalliteral darzustellen, nämlich 0o1000.
python 2.x
>>> 0o1000 512 >>> 01000 512
python 3.x
>>> 01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
Ungleichheitsoperatoren
In Python 2.x gibt es zwei Schreibweisen für 'ungleich': != und <>
In Python 3.x wurde <> entfernt, sodass nur != übrig blieb. Glücklicherweise habe ich nie die Angewohnheit entwickelt, <> zu verwenden.
Der ``-Ausdruck für repr wurde entfernt
In Python 2.x sind Backticks `` äquivalent zur repr-Funktion.
Python 3.x hat die ``-Syntax entfernt und erlaubt nur die repr-Funktion. Soll dadurch der Code übersichtlicher aussehen? Allerdings habe ich das Gefühl, dass die Gelegenheit, repr zu verwenden, selten ist; ich benutze es im Allgemeinen nur beim Debuggen. Meistens verwende ich die str-Funktion, um Objekte als Zeichenketten zu beschreiben.
def sendMail(from_: str, to: str, title: str, body: str) -> bool:
pass
Mehrere Module wurden umbenannt (gemäß PEP8)
| Alte Namen | Neue Namen |
|---|---|
| _winreg | winreg |
| ConfigParser | configparser |
| copy_reg | copyreg |
| Warteschlange | queue |
| SocketServer | socketserver |
| repr | reprlib |
Das StringIO-Modul ist jetzt in das neue io-Modul integriert. Module wie new, md5, gopherlib wurden entfernt. Python 2.6 unterstützt das neue io-Modul bereits.
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie und cookielib wurden in das Paket http integriert.
Die exec-Anweisung wurde entfernt, sodass nur noch die Funktion exec() übrig bleibt. Python 2.6 unterstützt die Funktion exec() bereits.
5. Datentypen
1) Py3.X hat den Typ long entfernt. Jetzt gibt es nur noch einen Ganzzahltyp — int, aber sein Verhalten entspricht dem Typ long in 2.X.
2) Ein neuer Typ bytes wurde hinzugefügt, der der 8-Bit-Zeichenkette in 2.X entspricht. Um ein bytes-Literal zu definieren:
>>> b = b'china' >>> type(b) <type 'bytes'>
str- und bytes-Objekte können die Methoden .encode() (str -> bytes) oder .decode() (bytes -> str) verwenden, um sie ineinander umzuwandeln.
>>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china'
3) Die dict-Methoden .keys(), .items() und .values() geben Iteratoren zurück, während die früheren Funktionen wie iterkeys() veraltet sind. Ebenfalls entfernt wurde dict.has_key(); verwenden Sie stattdessen 'in'.
6. Neuorganisation der Standardbibliothek
Python 3.x: Einige Module wurden neu organisiert oder umbenannt. Zum Beispiel wurden urllib und urlparse in urllib zusammengeführt.
# Python 2.x import urllib import urlparse # Python 3.x import urllib.parse
7. Die Funktionen iteritems() und items()
Python 2.x: Dictionaries besitzen die Methoden items() und iteritems(); items() gibt eine Liste zurück, iteritems() gibt einen Iterator zurück.
d = {'a': 1, 'b': 2}
d.items() # 返回 [('a', 1), ('b', 2)]
d.iteritems() # 返回字典的迭代器Python 3.x: iteritems() wurde entfernt, und items() gibt eine Dictionary-View zurück (d. h. einen Iterator).
d = {'a': 1, 'b': 2}
d.items() # 返回 dict_items([('a', 1), ('b', 2)])8. Modulunterstützung für __future__
Python 3.x: Viele Funktionen von Python 2.x wurden entfernt. Python-2.x-Benutzer, die das Verhalten von Python 3.x vorab in ihrem Code nutzen möchten, können __future__-Importe verwenden, um Kompatibilität zu erreichen.
from __future__ import print_function
9. Sortierung von Dictionaries
Python 2.x: Dictionaries sind ungeordnet (keine garantierte Reihenfolge).
Python 3.x: Dictionaries sind geordnet und behalten die Elemente in der Einfügereihenfolge bei.
10. next()-Methode
Python 2.x: next() ist eine Funktion, die normalerweise mit iter() verwendet wird.
Python 3.x: next() ist eine eingebaute Funktion, die auf dieselbe Weise wie in Python 2.x verwendet wird, aber ihre Parameter sind unterschiedlich. In Python 3.x kann ein Standardwert über next(iterator, default) festgelegt werden.
Weitere Erweiterungen