What’s Good About Python 3?


Delve into the importance and significance of Python 3 by exploring its key features, improvements, and advancements over its predecessor, Python 2.

Python, a versatile and widely used programming language, has undergone significant evolution since its inception. Among the major milestones in its journey, Python 3 emerges as a pivotal release, marked by substantial enhancements, modernisations, and refinements that solidify its position as a leading programming language in the software development landscape.

Python’s evolution spans multiple versions, with each iteration introducing new features, addressing limitations, and refining the language’s syntax and semantics.

Python 2, the predecessor to Python 3, laid the foundation for the language’s popularity, fostering a vibrant community of developers and powering a wide array of applications across various domains. However, as Python continued to evolve, it became apparent that certain design decisions and legacy features in Python 2 posed challenges for the language’s long-term growth and sustainability.

The development of Python 3 was driven by a desire to address shortcomings and inconsistencies in Python 2 while laying the groundwork for future innovation and expansion. Guided by the principles of simplicity, clarity, and pragmatism, Python 3 aimed to streamline the language, remove redundant constructs, and embrace modern software engineering practices. This forward-looking approach ensured that Python remained relevant and adaptable to the evolving needs of developers and the technological landscape.

Python 3 introduced a multitude of features and enhancements that significantly improved the language’s expressiveness, reliability, and performance. From enhanced Unicode support and syntax refinements to the introduction of type hints and asynchronous programming capabilities, Python 3 offered a comprehensive toolkit for building robust, scalable, and maintainable software solutions. These advancements empowered developers to tackle complex challenges with confidence, leveraging Python’s versatility and elegance to deliver high-quality code.

While Python 3 represented a substantial leap forward for the language, its adoption faced challenges due to compatibility concerns with existing Python 2 codebases. The coexistence of Python 2 and Python 3 ecosystems necessitated careful planning and migration strategies for transitioning legacy projects to Python 3. Despite initial hesitance and resistance from some quarters, the Python community rallied behind Python 3, advocating for its adoption and providing resources, tools, and guidance to facilitate the migration process.

Python 3 overview
Figure 1: Python 3 overview

Why is Python 3 important?

Enhanced Unicode support: Python 3 treats strings as sequences of Unicode characters by default, a departure from Python 2 where strings were sequences of bytes. This fundamental shift greatly simplifies text processing and internationalisation, making Python 3 more suitable for modern applications that deal with multilingual content.

Python 2: Strings can be stored as Unicode using the ‘u’ in front of them.

unicode_string = u”Hello, World! “

print unicode_string

Python 3:

unicode_string = “Hello, World!”


Syntax enhancements: Python 3 introduces several syntax enhancements and clarifications, enhancing code readability and consistency. Notable changes include the replacement of the print statement with the print() function, ensuring uniformity in code structure. Additionally, integer division now returns a float by default, avoiding common pitfalls associated with integer division in Python 2.

Print statement vs print function:

Python 2:

print “Hello, World!”

Python 3:

Print (“Hello, World!”)

Type hints: Type hints, introduced in Python 3, allow developers to annotate function arguments and return types, aiding in code understanding and maintenance. While these hints are not enforced by the interpreter, they enable static analysis tools to catch potential type-related errors early in the development process, promoting code reliability and maintainability.

Python 2:

# Type hints not supported

Python 3:

def add_numbers(a: int, b: int) -> int:

return a + b

result = add_numbers (3, 5)

print(“sum:”, result)

sum: 8

Extended iterators and generators: Python 3 enhances iterator and generator capabilities with features like the yield from syntax, simplifying the composition and delegation of iterable objects. These enhancements make it easier to write clean, concise, and efficient code, particularly when dealing with complex data processing tasks or large datasets.


Python 2: In Python 2, the range function creates a list of numbers and xrange() creates a generator.

for i in xrange(5):

print (i)


Python 3: In Python 3, xrange becomes range and range of Python 2 can be used as list(range).

for i in range(5):

print (i)

Enhanced standard library: Python 3 ships with an expanded and improved standard library, featuring updated modules and removing obsolete or redundant components. This modernisation ensures that developers have access to a rich set of tools and utilities for various development tasks, ranging from networking and file I/O to data manipulation and web development.

Python 2 vs Python 3
Figure 2: Python 2 vs Python 3

Asyncio for asynchronous programming: The introduction of the asyncio module in Python 3 facilitates asynchronous programming, enabling developers to write highly scalable and efficient I/O-bound applications. By leveraging coroutines and event loops, Python 3 empowers developers to build responsive and concurrent systems with ease, enhancing application performance and responsiveness.

Integer division: Python 2: In Python 2, integer division truncates the result towards zero, so 7 / 3 would result in 2.

division_result = 7 / 3
print division_result #Outputs: 2

Python 3: In Python 3, integer division returns a float if necessary, so 7 / 3 would result in 2.3333333333333335.

division_result = 7/3
print(division_result) #Outputs: 2.3333333333333335

Error handling: Python 3 now requires the ‘as’ keyword when you implement error handling. This change separates error handling syntax from function parameter syntax and makes error handling code easiest to read at a glance. Many developers transitioning from Python 2 to Python 3 overlook this small but important change.

Python 2:

except NameError, err:
print err, ‹Error Caused›

Python 3:

except NameError as err: # new `as` keyword
print (err, ‹Error Caused›)

Security improvements: Python 3 incorporates various security enhancements, including better hash algorithms and protections against common security vulnerabilities. By prioritising security, it offers a safer development environment, reducing the risk of potential exploits and vulnerabilities in deployed applications.

Performance optimisations: Python 3 introduces performance optimisations at both the interpreter and standard library levels, resulting in improved runtime performance and reduced resource consumption. These optimisations enhance the overall efficiency and scalability of Python applications, making Python 3 a compelling choice for high-performance computing tasks and large-scale deployments.

Python 2 vs Python 3

Choosing between Python 2 and 3 can be challenging, especially if you’re just starting out. However, there are some things to keep in mind that might help you decide.

If you’re starting a new project from scratch, you should use Python 3. It’s the future of the language, and it offers some benefits over Python 2 that can make your life easier in the long run.

However, if you need to maintain compatibility with Python 2 code or libraries, you’ll need to use Python 2 for your project. In this case, it’s probably best to learn both versions to be as versatile as possible.


Please enter your comment!
Please enter your name here