Wednesday, July 21, 2010

Python Programming Tutorial

Python is a remarkably powerful dynamic programming language that is used in a wide variety of application domains. Python is often compared to Tcl, Perl, Ruby, Scheme or Java. Some of its key distinguishing features include:
  • very clear, readable syntax
  • strong introspection capabilities
  • intuitive object orientation
  • natural expression of procedural code
  • full modularity, supporting hierarchical packages
  • exception-based error handling
  • very high level dynamic data types
  • extensive standard libraries and third party modules for virtually every task
  • extensions and modules easily written in C, C++ (or Java for Jython, or .NET languages for IronPython)
  • embeddable within applications as a scripting interface

Python is powerful... and fast

Fans of Python use the phrase "batteries included" to describe the standard library, which covers everything from asynchronous processing to zip files. The language itself is a flexible powerhouse that can handle practically any problem domain. Build your own web server in three lines of code. Build flexible data-driven code using Python's powerful and dynamic introspection capabilities and advanced language features such as meta-classes, duck typing and decorators.
Python lets you write the code you need, quickly. And, thanks to a highly optimized byte compiler and support libraries, Python code runs more than fast enough for most applications.


The Python Wiki


Python is a great object-oriented, interpreted, and interactive programming language. It is often compared (favorably of course :-) ) to Lisp, Tcl, Perl, Ruby, C#, Visual Basic, Visual Fox Pro, Scheme or Java... and it's much more fun.
Python combines remarkable power with very clear syntax. It has modules, classes, exceptions, very high level dynamic data types, and dynamic typing. There are interfaces to many system calls and libraries, as well as to various windowing systems. New built-in modules are easily written in C or C++ (or other languages, depending on the chosen implementation). Python is also usable as an extension language for applications written in other languages that need easy-to-use scripting or automation interfaces.


Python Beginners Guide

Python is a clear and powerful object-oriented programming language, comparable to Perl, Ruby, Scheme, or Java.
Some of Python's notable features:
  • Uses an elegant syntax, making the programs you write easier to read.
  • Is an easy-to-use language that makes it simple to get your program working. This makes Python ideal for prototype development and other ad-hoc programming tasks, without compromising maintainability.
  • Comes with a large standard library that supports many common programming tasks such as connecting to web servers, searching text with regular expressions, reading and modifying files.
  • Python's interactive mode makes it easy to test short snippets of code. There's also a bundled development environment called IDLE.
  • Is easily extended by adding new modules implemented in a compiled language such as C or C++.
  • Can also be embedded into an application to provide a programmable interface.
  • Runs on many different computers and operating systems: Windows, MacOS, many brands of Unix, OS/2, ...
  • Is free software in two senses. It doesn't cost anything to download or use Python, or to include it in your application. Python can also be freely modified and re-distributed, because while the language is copyrighted it's available under an open source license.
Some programming-language features of Python are:
  • A variety of basic data types are available: numbers (floating point, complex, and unlimited-length long integers), strings (both ASCII and Unicode), lists, and dictionaries.
  • Python supports object-oriented programming with classes and multiple inheritance.
  • Code can be grouped into modules and packages.
  • The language supports raising and catching exceptions, resulting in cleaner error handling.
  • Data types are strongly and dynamically typed. Mixing incompatible types (e.g. attempting to add a string and a number) causes an exception to be raised, so errors are caught sooner.
  • Python contains advanced programming features such as generators and list comprehensions.
  • Python's automatic memory management frees you from having to manually allocate and free memory in your code.
Sample Codes (Simple Programs)

These examples assume version 2.4 or above of Python. You should be able to run them simply by copying/pasting the code into a file and running Python. Or by inserting this line (#!/usr/bin/env python) at the beginning of your file (Unix/Linux), making the file executable (chmod u+x filename.py) and running it (./filename.py).


1 line: Output


   1 print 'Hello, world!'



2 lines: Input, assignment


   1 name = raw_input('What is your name?\n')
   2 print 'Hi, ' + name + '.'




  1. Usually, the raw_input function (renamed to input in Python 3) will prompt for a user's input on the same line. Writing \n will prompt the user on a new line.



  2. The print command is a function in Python 3.
  3. Here, we add the strings together. If we did not, and instead wrote




     print 'Hi,',name,'.' 
     
    we would get


     
    Hi, Jamie .




    Notice how there are spaces that we did not ask Python to write? These unasked for spaces occur when using commas to separate strings when using the print command. Rather, it may work better visually to use addition as I did in the example.

    3 lines: For loop, built-in enumerate function


       1 my_list = ['john', 'pat', 'gary', 'michael']
       2 for i, name in enumerate(my_list):
       3     print "iteration %i is %s" % (i, name)
    



    4 lines: Fibonacci, tuple assignment


       1 parents, babies = (1, 1)
       2 while babies < 100:
       3     print 'This generation has %d babies' % babies
       4     parents, babies = (babies, parents + babies)
    



    5 lines: Functions


       1 def greet(name):
       2     print 'hello', name
       3 greet('Jack')
       4 greet('Jill')
       5 greet('Bob')
    



    6 lines: Import, regular expressions


       1 import re
       2 for test_string in ['555-1212', 'ILL-EGAL']:
       3     if re.match(r'^\d{3}-\d{4}$', test_string):
       4         print test_string, 'is a valid US local phone number'
       5     else:
       6         print test_string, 'rejected'
    



    7 lines: Dictionaries, generator expressions


       1 prices = {'apple': 0.40, 'banana': 0.50}
       2 my_purchase = {
       3     'apple': 1,
       4     'banana': 6}
       5 grocery_bill = sum(prices[fruit] * my_purchase[fruit]
       6                    for fruit in my_purchase)
       7 print 'I owe the grocer $%.2f' % grocery_bill
    



    8 lines: Command line arguments, exception handling


       1 #!/usr/bin/env python
       2 # This program adds up integers in the command line
       3 import sys
       4 try:
       5     total = sum(int(arg) for arg in sys.argv[1:])
       6     print 'sum =', total
       7 except ValueError:
       8     print 'Please supply integer arguments'
    



    9 lines: Opening files


       1 # indent your Python code to put into an email
       2 import glob
       3 # glob supports Unix style pathname extensions
       4 python_files = glob.glob('*.py')
       5 for fn in sorted(python_files):
       6     print '    ------', fn
       7     for line in open(fn):
       8         print '    ' + line.rstrip()
       9     print
    



    10 lines: Time, conditionals


       1 import time
       2 now = time.localtime()
       3 hour = now.tm_hour
       4 if hour < 8: print 'sleeping'
       5 elif hour < 9: print 'commuting'
       6 elif hour < 17: print 'working'
       7 elif hour < 18: print 'commuting'
       8 elif hour < 20: print 'eating'
       9 elif hour < 22: print 'resting'
      10 else: print 'sleeping'
    



    11 lines: Triple-quoted strings, while loop


       1 REFRAIN = '''
       2 %d bottles of beer on the wall,
       3 %d bottles of beer,
       4 take one down, pass it around,
       5 %d bottles of beer on the wall!
       6 '''
       7 bottles_of_beer = 99
       8 while bottles_of_beer > 1:
       9     print REFRAIN % (bottles_of_beer, bottles_of_beer,
      10         bottles_of_beer - 1)
      11     bottles_of_beer -= 1
    



    12 lines: Classes


       1 class BankAccount(object):
       2     def __init__(self, initial_balance=0):
       3         self.balance = initial_balance
       4     def deposit(self, amount):
       5         self.balance += amount
       6     def withdraw(self, amount):
       7         self.balance -= amount
       8     def overdrawn(self):
       9         return self.balance < 0
      10 my_account = BankAccount(15)
      11 my_account.withdraw(5)
      12 print my_account.balance
    



    13 lines: Unit testing with unittest


       1 import unittest
       2 def median(pool):
       3     copy = sorted(pool)
       4     size = len(copy)
       5     if size % 2 == 1:
       6         return copy[(size - 1) / 2]
       7     else:
       8         return (copy[size/2 - 1] + copy[size/2]) / 2
       9 class TestMedian(unittest.TestCase):
      10     def testMedian(self):
      11         self.failUnlessEqual(median([2, 9, 9, 7, 9, 2, 4, 5, 8]), 7)
      12 if __name__ == '__main__':
      13     unittest.main()
    



    14 lines: Doctest-based testing


       1 def median(pool):
       2     '''Statistical median to demonstrate doctest.
       3     >>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
       4     7
       5     '''
       6     copy = sorted(pool)
       7     size = len(copy)
       8     if size % 2 == 1:
       9         return copy[(size - 1) / 2]
      10     else:
      11         return (copy[size/2 - 1] + copy[size/2]) / 2
      12 if __name__ == '__main__':
      13     import doctest
      14     doctest.testmod()
    



    15 lines: itertools


       1 import itertools
       2 lines = '''
       3 This is the
       4 first paragraph.
       5 
       6 This is the second.
       7 '''.splitlines()
       8 # Use itertools.groupby and bool to return groups of
       9 # consecutive lines that either have content or don't.
      10 for has_chars, frags in itertools.groupby(lines, bool):
      11     if has_chars:
      12         print ' '.join(frags)
      13 # PRINTS:
      14 # This is the first paragraph.
      15 # This is the second.
    



    16 lines: csv module, tuple unpacking, cmp() built-in


       1 import csv
       2 
       3 # write stocks data as comma-separated values
       4 writer = csv.writer(open('stocks.csv', 'wb', buffering=0))
       5 writer.writerows([
       6     ('GOOG', 'Google, Inc.', 505.24, 0.47, 0.09),
       7     ('YHOO', 'Yahoo! Inc.', 27.38, 0.33, 1.22),
       8     ('CNET', 'CNET Networks, Inc.', 8.62, -0.13, -1.49)
       9 ])
      10 
      11 # read stocks data, print status messages
      12 stocks = csv.reader(open('stocks.csv', 'rb'))
      13 status_labels = {-1: 'down', 0: 'unchanged', 1: 'up'}
      14 for ticker, name, price, change, pct in stocks:
      15     status = status_labels[cmp(float(change), 0.0)]
      16     print '%s is %s (%s%%)' % (name, status, pct)
    



    18 lines: 8-Queens Problem (recursion)


       1 BOARD_SIZE = 8
       2 
       3 def under_attack(col, queens):
       4     left = right = col
       5     for r, c in reversed(queens):
       6         left, right = left-1, right+1
       7         if c in (left, col, right):
       8             return True
       9     return False
      10 
      11 def solve(n):
      12     if n == 0: return [[]]
      13     smaller_solutions = solve(n-1)
      14     return [solution+[(n,i+1)]
      15         for i in range(BOARD_SIZE)
      16             for solution in smaller_solutions
      17                 if not under_attack(i+1, solution)]
      18 for answer in solve(BOARD_SIZE): print answer
    



    20 lines: Prime numbers sieve w/fancy generators


       1 import itertools
       2 
       3 def iter_primes():
       4      # an iterator of all numbers between 2 and +infinity
       5      numbers = itertools.count(2)
       6 
       7      # generate primes forever
       8      while True:
       9          # get the first number from the iterator (always a prime)
      10          prime = numbers.next()
      11          yield prime
      12 
      13          # this code iteratively builds up a chain of
      14          # filters...slightly tricky, but ponder it a bit
      15          numbers = itertools.ifilter(prime.__rmod__, numbers)
      16 
      17 for p in iter_primes():
      18     if p > 1000:
      19         break
      20     print p
    



    21 lines: XML/HTML parsing (using Python 2.5 or third-party library)


    1 dinner_recipe = '''<html><body><table>
       2 <tr><th>amt</th><th>unit</th><th>item</th></tr>
       3 <tr><td>24</td><td>slices</td><td>baguette</td></tr>
       4 <tr><td>2+</td><td>tbsp</td><td>olive oil</td></tr>
       5 <tr><td>1</td><td>cup</td><td>tomatoes</td></tr>
       6 <tr><td>1</td><td>jar</td><td>pesto</td></tr>
       7 </table></body></html>'''
       8 
       9 # In Python 2.5 or from http://effbot.org/zone/element-index.htm
      10 import xml.etree.ElementTree as etree
      11 tree = etree.fromstring(dinner_recipe)
      12 
      13 # For invalid HTML use http://effbot.org/zone/element-soup.htm
      14 # import ElementSoup, StringIO
      15 # tree = ElementSoup.parse(StringIO.StringIO(dinner_recipe))
      16 
      17 pantry = set(['olive oil', 'pesto'])
      18 for ingredient in tree.getiterator('tr'):
      19     amt, unit, item = ingredient
      20     if item.tag == "td" and item.text not in pantry:
      21         print "%s: %s %s" % (item.text, amt.text, unit.text)



    28 lines: 8-Queens Problem (define your own exceptions)


       1 BOARD_SIZE = 8
       2 
       3 class BailOut(Exception):
       4     pass
       5 
       6 def validate(queens):
       7     left = right = col = queens[-1]
       8     for r in reversed(queens[:-1]):
       9         left, right = left-1, right+1
      10         if r in (left, col, right):
      11             raise BailOut
      12 
      13 def add_queen(queens):
      14     for i in range(BOARD_SIZE):
      15         test_queens = queens + [i]
      16         try:
      17             validate(test_queens)
      18             if len(test_queens) == BOARD_SIZE:
      19                 return test_queens
      20             else:
      21                 return add_queen(test_queens)
      22         except BailOut:
      23             pass
      24     raise BailOut
      25 
      26 queens = add_queen([])
      27 print queens
      28 print "\n".join(". "*q + "Q " + ". "*(BOARD_SIZE-q-1) for q in queens)
    



    33 lines: "Guess the Number" Game from http://inventwithpython.com


       1 import random
       2 
       3 guessesTaken = 0
       4 
       5 print 'Hello! What is your name?'
       6 myName = raw_input()
       7 
       8 number = random.randint(1, 20)
       9 print 'Well, ' + myName + ', I am thinking of a number between 1 and 20.'
      10 
      11 while guessesTaken &lt; 6:
      12     print 'Take a guess.'
      13     guess = raw_input()
      14     guess = int(guess)
      15 
      16     guessesTaken = guessesTaken + 1
      17 
      18     if guess &lt; number:
      19         print 'Your guess is too low.'
      20 
      21     if guess &gt; number:
      22         print 'Your guess is too high.'
      23 
      24     if guess == number:
      25         break
      26 
      27 if guess == number:
      28     guessesTaken = str(guessesTaken)
      29     print 'Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!'
      30 
      31 if guess != number:
      32     number = str(number)
      33     print 'Nope. The number I was thinking of was ' + number 

     

    No comments:

    Post a Comment