The skill to program digital computers is important for modern engineers. We routinely use computers to process data, perform numerical analysis and simulations, and control devices. We need a programming language. In this document, we are going to show that Python is such a good choice, and how to use it to solve technical problems.
The programming language Python was first made public in 1991. Python is a multi-paradigm and batteries-included programming language. It supports imperative, structural, object-oriented, and functional programming. It contains a wide spectrum of standard libraries, and has more than 10,000 3rd-party packages available online. The flexibility in programming paradigms allows the users to attack a problem with a suitable approach. The versatility of libraries further enriches our armament. Moreover, Python allows straight-forward extension to its core implementation via the C API. The interpreter itself can be easily incorporated into another host system. Regarding problem-solving, Python is much more than a programming language. It’s more like an extensible runtime environment with rich programmability.
Python is an interpreted language with a strong and dynamic typing system. In most Unix-based computers, Python is pre-installed and one can enter its interactive mode in a terminal:
$ python Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
to perform calculation:
>>> import sys, math >>> sys.stdout.write('%g\n' % math.pi) 3.14159 >>> sys.stdout.write('%g\n' % math.cos(45./180.*math.pi)) 0.707107 >>>
Indeed Python is both powerful and easy-to-use. But what makes Python great for technical applications is its compatibility to engineering and scientific discipline. See The Zen of Python (Python Enhancement Proposal (PEP) 20):
$ python -c 'import this' The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!
These proverbs are the general guidelines for Python programmers. It promotes several points favorable for engineers and scientists:
The more I write Python, the more I like it. Although there are many good programming languages (or environments), and some can be more convenient than Python in specific areas, only Python and its community have a value system so close to the training I received as a computational scientist.
The Zen of Python is very insightful to programming Python. Breaking the Zen means not writing “Pythonic” code. Python programmers like to establish conventions for solving similar problems. Programming Python is usually idiomatic. For example, when converting a sequence of data, it is encouraged to use a list comprehension:
line = '1 2 3' # it is concise and clear if you know what's a list comprehension. values = [float(tok) for tok in line.split()]
rather than a loop:
line = '1 2 3' # it works, but is not idiomatic to Python, i.e., not "Pythonic". values =  for tok in line.split(): values.append(float(tok))
But it doesn’t mean using list comprehensions is always preferred. Consider a list of lines:
lines = ['1 2 3\n', '4 5 6\n'] # nested list comprehensions are not easy to understand. values = [float(tok) for line in lines for tok in line.split()] # so a loop now looks more concise. values =  for line in lines: values.extend(float(tok) for tok in line.split())
Python has a good balance between freedom and discipline in coding. The idiomatic style is a powerful weapon to create maintainable code.
This project is intended to provide introductory information about Python for technical computing. It includes a set of documents and the corresponding code snippets. The code is hosted at https://bitbucket.org/yungyuc/pyengr and you can find the up-to-date documentation built at http://pyengr.readthedocs.org/en/latest/. The project is licensed under GNU GPLv2.