Differences between revisions 106 and 107
 ⇤ ← Revision 106 as of 2009-11-20 17:15:12 → Size: 9979 Editor: StevenBethard Comment: ← Revision 107 as of 2009-11-25 04:33:22 → ⇥ Size: 10866 Editor: AlSweigart Comment: Adding "guess the number" game source. Deletions are marked like this. Additions are marked like this. Line 328: Line 328: ------ 33 lines: "Guess the Number" Game from http://inventwithpython.com{{{#!pythonimport randomguessesTaken = 0print 'Hello! What is your name?'myName = raw_input()number = random.randint(1, 20)print 'Well, ' + myName + ', I am thinking of a number between 1 and 20.'while guessesTaken < 6:    print 'Take a guess.'    guess = raw_input()    guess = int(guess)    guessesTaken = guessesTaken + 1    if guess < number:        print 'Your guess is too low.'    if guess > number:        print 'Your guess is too high.'    if guess == number:        breakif guess == number:    guessesTaken = str(guessesTaken)    print 'Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!'if guess != number:    number = str(number)    print 'Nope. The number I was thinking of was ' + number}}}

Here are some example simple programs. Please feel free to contribute, but see notice at bottom, please.

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 (#!/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
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)]
```

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
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:
22         except BailOut:
23             pass
24     raise BailOut
25
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 < 6:
12     print 'Take a guess.'
13     guess = raw_input()
14     guess = int(guess)
15
16     guessesTaken = guessesTaken + 1
17
18     if guess < number:
19         print 'Your guess is too low.'
20
21     if guess > 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
```

Hi, I started this page in May 2007, and I provided the first 10+ or so examples (which may have changed since then). -- SteveHowell