Here are some of the key differences that a developer should be aware of:
- Text and Data instead of Unicode and 8-bit strings. Python 3.0 uses the concepts of text and (binary) data instead of Unicode strings and 8-bit strings. The biggest ramification of this is that any attempt to mix text and data in Python 3.0 raises a TypeError (to combine the two safely, you must decode bytes or encode Unicode, but you need to know the proper encoding, e.g. UTF-8)
- This addresses a longstanding pitfall for naïve Python programmers. In Python 2, mixing Unicode and 8-bit data would work if the string happened to contain only 7-bit (ASCII) bytes, but you would get UnicodeDecodeError if it contained non-ASCII values. Moreover, the exception would happen at the combination point, not at the point at which the non-ASCII characters were put into the str object. This behavior was a common source of confusion and consternation for neophyte Python programmers.
print
function. The print statement has been replaced with a print() functionxrange
– buh-bye. xrange() no longer exists (range() now behaves like xrange() used to behave, except it works with values of arbitrary size)- API changes:
zip()
,map()
andfilter()
all now return iterators instead of lists.dict.keys()
,dict.items()
anddict.values()
now return ‘views’ instead of lists.dict.iterkeys()
,dict.iteritems()
anddict.itervalues()
are no longer supported.- Comparison operators. The ordering comparison operators (<, <=, >=, >) now raise a TypeError exception when the operands don’t have a meaningful natural ordering. Some examples of the ramifications of this include:
- Expressions like 1 < ”, 0 > None or len <= len are no longer valid
- None < None now raises a TypeError instead of returning False
- Sorting a heterogeneous list no longer makes sense.
- All the elements must be comparable to each other