hier wird der Versuch unternommen, die Änderungen, die in python-3.x auf uns zukommen/zugekommen sind, peu-en-peu aufzulisten. Jene unter euch, die mit python3 begonnen haben und python2.x nie kennengelernt haben, brauchen diese Aufstellung nicht durchzugehen, denn es fragt sich: wofür?
es wird hier gar nicht erst der versuch unternommen, einen anspruch auf vollständigkeit zu stellen.
wenn du einen Beitrag liefern willst, ist das sehr willkommen!
- Folgendes funktionierte in python2.X, und geht nicht mehr in python3.X:
>>> 'b' > 5
True
>>> 'c' < 2
False
>>> 'aber' == 5
False
>>>
und i npython 3:
>>> 'b' > 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
>>> 'c' < 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
>>> 'aber' == 5
False
>>>
Was wir beim letzten Beispiel gesehen haben ist, dass objekte ungleichen Typs NIEMALS gleich (==) sein können (also immer False zurückkommen muss), und gleichzeitig wurde auch keine exception geraised, weil die Antwort stimmt - Objekte unterschiedlichen typs sind nicht gleich!
- in python2.X gab/gibt es die Module Pickle bzw. das schnellere cPickle.
in python3 heißt cPickle nun pickle (ACHTUNG! das ist ein kleines p!); Pickle (großes P) galt hingegen in python2 eh schon als obsolete.
- es gibt dictionary-comprehension - das gibt's in python2.6.5 nicht (erst ab python-2.7!, nachdem es ja schon zuvor in python3.0 eingeführt wurde.)
>>> l = [1,2,3,4,5]
>>> d = { i:i*i for i in l}
>>> print(d)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
>>>
- print ist in python-3.x eine Funktion! Also runde Klammern um das bilden, was der print-Anweisung in python2.x folgte.
>>> print("hallo welt")
hallo welt
>>> help(print)
...
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=false)
ein Blick in help(print) lohnt sich in jedem Fall.
- input() ist ab sofort wie raw_input() (input() gibt ein str-Objekt zurück). raw_input() gibt es in python3 nicht mehr.
>>> a = input("ihre eingabe: ")
Ihre Eingabe: 123
>>> type(a)
<class 'str'>
>>>
- tuple-parameter unpacking gibt es nimmr in python3.
def unpack(a, (b,c,))
ging in python2, in python3 aber
>>> def nounpack(a, (b,c,)):
File "<stdin>", line 1
def nounpack(a, (b,c,)):
^
SyntaxError: invalid syntax
>>>
- Die Division zweier Zahlen von Typ int ergeben ein float-Objekt.
>>> print(2/3)
0.666666666667
>>> print (2//3)
0
>>>
- "has_key"-Methode am dict-Objekt gibt es in python3 nimmer.
>>> D = dict(vorname='matthias', nachname='sarang')
>>> D
{'nachname': 'sarang', 'vorname': 'matthias'}
>>> D.has_key('nachname')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'has_key'
>>> 'vorname' in D
True
>>>
- keine "old-style"-Klassen mehr in python3! Alle Klassen sind automatisch new-style-Klassen. Man braucht keine
__metaclass__ = type
Angabe mehr setzen bzw. von object erben. Ein einfaches class Foo:
reicht schon aus!
- bei Iteratoren wird die __next__-Methode über eine built-in-function next() aufgerufen.
Was sich ändert ist der Aufruf von next:
it.next()
wird zu next(it)
oder it.__next__()
-
die nachstehende Zuweisung gibt's auch erst ab python3.X
fasten your seat-belts!
>>> a,*b,c = 1,2,3,4,5,6,
>>> a
1
>>> b
[2, 3, 4, 5]
>>> c
6
>>> a,b,*c = 1,2,3,4,5,6,
>>> a
1
>>> b
2
>>> c
[3, 4, 5, 6]
>>>
- die range()-Funktion in python3.X liefert integer
on demand
, also nicht gleich die ganze Liste mit integer in den Arbeitsspeicher (das hilft memory sparen und erhöht speed); wir kannten das in python2 als xrange().
- sets -
a = {1,2,3,3}
ergibt ein set! Aber Vorsicht. {}
ist ein leeres dict, während set() ein leeres set-Objekt erzeugt!
- <> als Zeichen für Ungleichheit ist in python3 nicht mehr möglich. Es geht nur noch !=.
>>> 1 <> 2
File "<stdin>", line 1
1 <> 2
^
SyntaxError: invalid syntax
>>> 1 != 2
True
>>>
- backquotes anstelle von repr() sind nicht mehr zulässig.
>>> `'hallo'`
File "<stdin>", line 1
`'hallo'`
^
SyntaxError: invalid syntax
>>>
-
Man kann nicht mehr Objekte unterschiedlichen Typs miteinander vergleichen. In python2 geht:
>>> 5 < '5'
True
>>>
und in python3 endet dieses Ansinnen folgendermaßen:
>>> 5 < '5'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
>>>
- Module wurden aus Standard Library entfernt (solche, die schon sehr veraltet sind wie md5, oder mimetools)
- andere wurden umbenannt, um PEP-8 zu entsprechen (copy_reg heißt jetzt copyreg, ConfigParser wurde zu configparser).
- manche Module wurden zu einem Paket zusammengefasst (zum Beispiel, die http-relevanten Module wie httplib wurden im Paket http zusammengefasst)
- zip(), map() und filter() retournieren einen Iterator
- dict.keys(), dict.values() und dict.items() retournieren einen view, und nicht mehr eine Liste
- default python-source-encoding ist utf-8. NON-ascii identifier sind von nun ab erlaubt.
- Function annotations kam mit python3.0, gibt es in python2.X NICHT.
Gemeint ist, zum Beispiel:
def check_anot(a:int, b:str) -> float:
pass
- long wurde zu int --> nur EIN integer Typ OHNE angehängtem L
- sys.maxint ist weg - es gibt keinen maxint mehr
dafür gibt es jetzt sys.maxsize (2**31-1 oder bei 64-bit 2**63-1); das ist jener Wert, der maximal referenziert werden kann.
- Neue built-in string-Formatierung ersetzt %-Operator!
- Es gilt jetzt
raise Exception(args)
und nicht wie bisher
raise Exception, args
- Ähnlich zu den Dekoratoren bei Funktionen gibt es nun auch class-decorators
- Es wurde Abstrakte Klasse, @abstractmethod und @abstractproperty hinzugefügt.
- True, False, as, None und with sind neue Keywords
- super kann jetzt ohne Parameter aufgerufen werden und wird trotzdem das Richtige tun.
- builtin-function apply() ist weg! An Stelle von
apply(function,args)
schreibt man in python3 einfach f(*x)
- coerce wurde ersatzlos gestrichen.
- execfile wurde durch exec() ersetzt.
- built-in-function cmp() gibt es nicht mehr in python3
- ab python3.2 gibt es das Modul argparse, damit wird optparse deprecated
- file wurde ersatzlos gestrichen.
- reduce ist in python2.X eine built-in-function, gehört in python3.X nun aber zum functools-Modul.
from functools import reduce
- Modul StringIO ist jetzt im Modul io zu finden
File-like objects that read from or write to a string buffer
- reload( <modulename>) gibt es in python3 nicht mehr als built-in-fucntion - das ist ins imp-Modul verschoben worden - also
import imp
imp.reload(mymod)
- Neue Schreibweise für Oktalzahl. Statt
O666
schreibt man jetzt Oo666
- die built-in class basestring (abstract type) wurde rausgeschmissen; nutze str stattdessen! (isinstance('string', basestring) -> isinstance('string', str) )
- Das Modul ipaddress wurde mit python-3.3 in die STL eingeführt