Important differences between Python 2.x and Python 3.x with examples
Last Updated :
06 Sep, 2023
In this article, we will see some important differences between Python 2.x and Python 3.x with the help of some examples.
Differences between Python 2.x and Python 3.x
Here, we will see the differences in the following libraries and modules:
Python Division operator
If we are porting our code or executing python 3.x code in python 2.x, it can be dangerous if integer division changes go unnoticed (since it doesn’t raise any error). It is preferred to use the floating value (like 7.0/5 or 7/5.0) to get the expected result when porting our code. For more information about this you can refer to Division Operator in Python.
Python3
print ( 7 / 5 )
print ( - 7 / 5 )
|
Print Function in Python
This is the most well-known change. In this, the print keyword in Python 2.x is replaced by the print() function in Python 3.x. However, parentheses work in Python 2 if space is added after the print keyword because the interpreter evaluates it as an expression. You can refer to Print Single Multiple Variable Python for more info about this topic.
In this example, we can see, if we don’t use parentheses in python 2.x then there is no issue but if we don’t use parentheses in python 3.x, we get SyntaxError.
Python3
print 'Hello, Geeks'
print ( 'Hope You like these facts' )
|
Unicode In Python
In Python 2, an implicit str type is ASCII. But in Python 3.x implicit str type is Unicode. In this example, difference is shown between both the version of Python with the help of code and also the output in Python comments.
Python3
print ( type ( 'default string ' ))
print ( type (b 'string with b ' ))
|
Python 2.x also supports Unicode
Python3
print ( type ( 'default string ' ))
print ( type (u 'string with b ' ))
|
xrange vs range() in both versions
xrange() of Python 2.x doesn’t exist in Python 3.x. In Python 2.x, range returns a list i.e. range(3) returns [0, 1, 2] while xrange returns a xrange object i. e., xrange(3) returns iterator object which works similar to Java iterator and generates number when needed.
If we need to iterate over the same sequence multiple times, we prefer range() as range provides a static list. xrange() reconstructs the sequence every time. xrange() doesn’t support slices and other list methods. The advantage of xrange() is, it saves memory when the task is to iterate over a large range.
In Python 3.x, the range function now does what xrange does in Python 2.x, so to keep our code portable, we might want to stick to using a range instead. So Python 3.x’s range function is xrange from Python 2.x. You can refer to this article for more understanding range() vs xrange() in Python.
Python3
for x in xrange ( 1 , 5 ):
print (x),
for x in range ( 1 , 5 ):
print (x),
|
Error Handling
There is a small change in error handling in both versions. In latest version of Python, ‘as’ keyword is optional.
Python3
try :
trying_to_check_error
except NameError, err:
print err, 'Error Caused'
|
In this example, error handling is shown without the use of “as” keyword.
Python3
try :
trying_to_check_error
except NameError as err:
print (err, 'Error Caused' )
try :
trying_to_check_error
except NameError:
print ( 'Error Caused' )
|
__future__ module in Python
This is basically not a difference between the two versions, but a useful thing to mention here. The idea of the __future__ module is to help migrate to Python 3.x.
If we are planning to have Python 3.x support in our 2.x code, we can use _future_ imports in our code.
For example, in the Python 2.x code below, we use Python 3.x’s integer division behavior using the __future__ module.
Python3
from __future__ import division
print ( 7 / 5 )
print ( - 7 / 5 )
|
Output:
1.4
-1.4
Another example where we use brackets in Python 2.x using __future__ module:
Python3
from __future__ import print_function
print ( 'GeeksforGeeks' )
|
Output:
GeeksforGeeks
Please Login to comment...