Differences between revisions 150 and 155 (spanning 5 versions)
Revision 150 as of 2014-05-09 23:48:31
Size: 9512
Comment: revert spam
Revision 155 as of 2019-11-09 23:29:53
Size: 9662
Comment: Remove Python 2-specific information, leaving a link to previous revision for accessibility
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
The examples below will increase in number of lines of code and difficulty:
Line 3: Line 5:






{{{
print 'Hello, world!'
}}}



----
{{{
print ('Hello, world!')
}}}
----
Line 19: Line 11:






{{{
name = raw_input('What is your name?\n')
print 'Hi, %s.' % name
}}}



----
{{{
name = input('What is your name?\n')
print ('Hi, %s.' % name)
}}}
----
Line 35: Line 17:





Line 45: Line 21:
    print "iteration {iteration} is {name}".format(iteration=i, name=name)
}}}



----
    print ("iteration {iteration} is {name}".format(iteration=i, name=name))
}}}
----
Line 53: Line 25:





Line 63: Line 29:
    print 'This generation has {0} babies'.format(babies)     print ('This generation has {0} babies'.format(babies))
Line 66: Line 32:



----
----
Line 73: Line 35:





Line 81: Line 37:
    print 'Hello', name     print ('Hello', name)
Line 86: Line 43:



----
----
Line 92: Line 45:





Line 103: Line 50:
        print test_string, 'is a valid US local phone number'         print (test_string, 'is a valid US local phone number')
Line 105: Line 52:
        print test_string, 'rejected'
}}}



----
        print (test_string, 'rejected')
}}}
----
Line 113: Line 56:





Line 127: Line 64:
print 'I owe the grocer $%.2f' % grocery_bill
}}}



----
print ('I owe the grocer $%.2f' % grocery_bill)
}}}
----
Line 136: Line 69:






{{{

#! /usr/bin/env python

# This program adds up integers in the command line
{{{
# This program adds up integers that have been passed as arguments in the command line
Line 149: Line 74:
    print 'sum =', total     print ('sum =', total)
Line 151: Line 76:
    print 'Please supply integer arguments'
}}}



----
    print ('Please supply integer arguments')
}}}
----
Line 159: Line 80:





Line 172: Line 87:
    print ' ------' + file_name     print (' ------' + file_name)
Line 176: Line 91:
            print ' ' + line.rstrip()

    print
}}}



----
            print (' ' + line.rstrip())

    print()
}}}
----
Line 186: Line 97:





Line 208: Line 113:
        print activities[activity_time]         print (activities[activity_time])
Line 211: Line 116:
    print 'Unknown, AFK or sleeping!'
}}}



----
    print ('Unknown, AFK or sleeping!')
}}}
----
Line 219: Line 120:





Line 233: Line 128:
bottles_of_beer = 99 bottles_of_beer = 9
Line 235: Line 130:
    print REFRAIN % (bottles_of_beer, bottles_of_beer,
        bottles_of_beer - 1)
    print (REFRAIN % (bottles_of_beer, bottles_of_beer,
        bottles_of_beer - 1))
Line 239: Line 134:



----
----
Line 245: Line 136:





Line 263: Line 148:
my_account.withdraw(5)
print my_account.balance
}}}



----
my_account.withdraw(50)
print (my_account.balance, my_account.overdrawn())
}}}
----
Line 272: Line 153:





Line 285: Line 160:
        return copy[(size - 1) / 2]         return copy[int((size - 1) / 2)]
Line 287: Line 162:
        return (copy[size/2 - 1] + copy[size/2]) / 2         return (copy[int(size/2 - 1)] + copy[int(size/2)]) / 2
Line 290: Line 165:
        self.failUnlessEqual(median([2, 9, 9, 7, 9, 2, 4, 5, 8]), 7)         self.assertEqual(median([2, 9, 9, 7, 9, 2, 4, 5, 8]), 7)
Line 294: Line 169:



----
----
Line 300: Line 171:





Line 311: Line 176:
    7     6 #change to 7 in order to pass the test
Line 316: Line 181:
        return copy[(size - 1) / 2]         return copy[int((size - 1) / 2)]
Line 318: Line 183:
        return (copy[size/2 - 1] + copy[size/2]) / 2         return (copy[int(size/2 - 1)] + copy[int(size/2)]) / 2
Line 323: Line 188:



----
----
Line 329: Line 190:





Line 348: Line 203:
        print ' '.join(frags)         print (' '.join(frags))
Line 353: Line 208:



----
----
Line 360: Line 211:





Line 369: Line 214:
# need to define cmp function in Python 3
def cmp(a, b):
    return (a > b) - (a < b)
Line 370: Line 219:
writer = csv.writer(open('stocks.csv', 'wb', buffering=0))
writer.writerows([
    (
'GOOG', 'Google, Inc.', 505.24, 0.47, 0.09),
    (
'YHOO', 'Yahoo! Inc.', 27.38, 0.33, 1.22),
    (
'CNET', 'CNET Networks, Inc.', 8.62, -0.13, -1.49)
])
with open('stocks.csv', 'w', newline='') as stocksFileW:
    writer =
csv.writer(stocksFileW)
    writer.writerows
([
        [
'GOOG', 'Google, Inc.', 505.24, 0.47, 0.09],
        [
'YHOO', 'Yahoo! Inc.', 27.38, 0.33, 1.22],
        [
'CNET', 'CNET Networks, Inc.', 8.62, -0.13, -1.4901]
    ]
)
Line 378: Line 228:
stocks = csv.reader(open('stocks.csv', 'rb'))
status_lab
els = {-1: 'down', 0: 'unchanged', 1: 'up'}
for ticker, name, price, change, pct in stocks:
    status = status_labels[cmp(float(change), 0.0)]
    print '%s is %s (%s%%)' % (name, status, pct)
}}}



----
with open('stocks.csv', 'r') as stocksFile:
    
stocks = csv.reader(stocksFile)

    status_la
bels = {-1: 'down', 0: 'unchanged', 1: 'up'}
    for ticker, name, price, change, pct in stocks:
     status = status_labels[cmp(float(change), 0.0)]
        print ('%s is %s (%.2f)' % (name, status, float(pct)))
}}}
----
Line 390: Line 238:





Line 417: Line 259:
        for i in xrange(BOARD_SIZE)         for i in range(BOARD_SIZE)
Line 421: Line 263:
    print answer
}}}



----
    print (answer)
}}}
----
Line 429: Line 267:





Line 446: Line 278:
         prime = numbers.next()          prime = next(numbers)
Line 451: Line 283:
         numbers = itertools.ifilter(prime.__rmod__, numbers)          numbers = filter(prime.__rmod__, numbers)
Line 456: Line 288:
    print p
}}}



----

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





    print (p)
}}}
----
21 lines: XML/HTML parsing
Line 480: Line 302:
# In Python 2.5 or from http://effbot.org/zone/element-index.htm # From http://effbot.org/zone/element-index.htm
Line 492: Line 314:
        print "%s: %s %s" % (item.text, amt.text, unit.text)
}}}



----
        print ("%s: %s %s" % (item.text, amt.text, unit.text))
}}}
----
Line 500: Line 318:





Line 534: Line 346:
print queens
print "\n".join(". "*q + "Q " + ". "*(BOARD_SIZE-q-1) for q in queens)
}}}



----
print (queens)
print ("\n".join(". "*q + "Q " + ". "*(BOARD_SIZE-q-1) for q in queens))
}}}
----
Line 544: Line 352:





Line 555: Line 357:
name = raw_input('Hello! What is your name?\n') name = input('Hello! What is your name?\n')
Line 558: Line 360:
print 'Well, {0}, I am thinking of a number between 1 and 20.'.format(name) print ('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))
Line 562: Line 364:
    guess = int(raw_input('Take a guess: '))     guess = int(input('Take a guess: '))
Line 567: Line 369:
        print 'Your guess is too low.'         print ('Your guess is too low.')
Line 570: Line 372:
        print 'Your guess is too high.'         print ('Your guess is too high.')
Line 576: Line 378:
    print 'Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made)     print ('Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made))
Line 578: Line 380:
    print 'Nope. The number I was thinking of was {0}'.format(number)
}}}



----

[[CategoryDocumentation|CategoryDocumentation]]
    print ('Nope. The number I was thinking of was {0}'.format(number))
}}}

----
These all run under Python 3. If you are interested in differences between Python 2 and Python 3, please take a look at the [[https://wiki.python.org/moin/SimplePrograms?action=recall&rev=154|previous version of this page]].
----
CategoryDocumentation

The examples below will increase in number of lines of code and difficulty:

1 line: Output

print ('Hello, world!')


2 lines: Input, assignment

name = input('What is your name?\n')
print ('Hi, %s.' % name)


3 lines: For loop, built-in enumerate function, new style formatting

friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print ("iteration {iteration} is {name}".format(iteration=i, name=name))


4 lines: Fibonacci, tuple assignment

parents, babies = (1, 1)
while babies < 100:
    print ('This generation has {0} babies'.format(babies))
    parents, babies = (babies, parents + babies)


5 lines: Functions

def greet(name):
    print ('Hello', name)

greet('Jack')
greet('Jill')
greet('Bob')


6 lines: Import, regular expressions

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


7 lines: Dictionaries, generator expressions

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


8 lines: Command line arguments, exception handling

# This program adds up integers that have been passed as arguments in the command line
import sys
try:
    total = sum(int(arg) for arg in sys.argv[1:])
    print ('sum =', total)
except ValueError:
    print ('Please supply integer arguments')


9 lines: Opening files

# indent your Python code to put into an email
import glob
# glob supports Unix style pathname extensions
python_files = glob.glob('*.py')
for file_name in sorted(python_files):
    print ('    ------' + file_name)

    with open(file_name) as f:
        for line in f:
            print ('    ' + line.rstrip())

    print()


10 lines: Time, conditionals, from..import, for..else

from time import localtime

activities = {8: 'Sleeping',
              9: 'Commuting',
              17: 'Working',
              18: 'Commuting',
              20: 'Eating',
              22: 'Resting' }

time_now = localtime()
hour = time_now.tm_hour

for activity_time in sorted(activities.keys()):
    if hour < activity_time:
        print (activities[activity_time])
        break
else:
    print ('Unknown, AFK or sleeping!')


11 lines: Triple-quoted strings, while loop

REFRAIN = '''
%d bottles of beer on the wall,
%d bottles of beer,
take one down, pass it around,
%d bottles of beer on the wall!
'''
bottles_of_beer = 9
while bottles_of_beer > 1:
    print (REFRAIN % (bottles_of_beer, bottles_of_beer,
        bottles_of_beer - 1))
    bottles_of_beer -= 1


12 lines: Classes

class BankAccount(object):
    def __init__(self, initial_balance=0):
        self.balance = initial_balance
    def deposit(self, amount):
        self.balance += amount
    def withdraw(self, amount):
        self.balance -= amount
    def overdrawn(self):
        return self.balance < 0
my_account = BankAccount(15)
my_account.withdraw(50)
print (my_account.balance, my_account.overdrawn())


13 lines: Unit testing with unittest

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


14 lines: Doctest-based testing

def median(pool):
    '''Statistical median to demonstrate doctest.
    >>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
    6 #change to 7 in order to pass the test
    '''
    copy = sorted(pool)
    size = len(copy)
    if size % 2 == 1:
        return copy[int((size - 1) / 2)]
    else:
        return (copy[int(size/2 - 1)] + copy[int(size/2)]) / 2
if __name__ == '__main__':
    import doctest
    doctest.testmod()


15 lines: itertools

from itertools import groupby
lines = '''
This is the
first paragraph.

This is the second.
'''.splitlines()
# Use itertools.groupby and bool to return groups of
# consecutive lines that either have content or don't.
for has_chars, frags in groupby(lines, bool):
    if has_chars:
        print (' '.join(frags))
# PRINTS:
# This is the first paragraph.
# This is the second.


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

import csv

# need to define cmp function in Python 3
def cmp(a, b):
    return (a > b) - (a < b)

# write stocks data as comma-separated values
with open('stocks.csv', 'w', newline='') as stocksFileW:
    writer = csv.writer(stocksFileW)
    writer.writerows([
        ['GOOG', 'Google, Inc.', 505.24, 0.47, 0.09],
        ['YHOO', 'Yahoo! Inc.', 27.38, 0.33, 1.22],
        ['CNET', 'CNET Networks, Inc.', 8.62, -0.13, -1.4901]
    ])

# read stocks data, print status messages
with open('stocks.csv', 'r') as stocksFile:
    stocks = csv.reader(stocksFile)

    status_labels = {-1: 'down', 0: 'unchanged', 1: 'up'}
    for ticker, name, price, change, pct in stocks:
        status = status_labels[cmp(float(change), 0.0)]
        print ('%s is %s (%.2f)' % (name, status, float(pct)))


18 lines: 8-Queens Problem (recursion)

BOARD_SIZE = 8

def under_attack(col, queens):
    left = right = col

    for r, c in reversed(queens):
        left, right = left - 1, right + 1

        if c in (left, col, right):
            return True
    return False

def solve(n):
    if n == 0:
        return [[]]

    smaller_solutions = solve(n - 1)

    return [solution+[(n,i+1)]
        for i in range(BOARD_SIZE)
            for solution in smaller_solutions
                if not under_attack(i+1, solution)]
for answer in solve(BOARD_SIZE):
    print (answer)


20 lines: Prime numbers sieve w/fancy generators

import itertools

def iter_primes():
     # an iterator of all numbers between 2 and +infinity
     numbers = itertools.count(2)

     # generate primes forever
     while True:
         # get the first number from the iterator (always a prime)
         prime = next(numbers)
         yield prime

         # this code iteratively builds up a chain of
         # filters...slightly tricky, but ponder it a bit
         numbers = filter(prime.__rmod__, numbers)

for p in iter_primes():
    if p > 1000:
        break
    print (p)


21 lines: XML/HTML parsing

dinner_recipe = '''<html><body><table>
<tr><th>amt</th><th>unit</th><th>item</th></tr>
<tr><td>24</td><td>slices</td><td>baguette</td></tr>
<tr><td>2+</td><td>tbsp</td><td>olive oil</td></tr>
<tr><td>1</td><td>cup</td><td>tomatoes</td></tr>
<tr><td>1</td><td>jar</td><td>pesto</td></tr>
</table></body></html>'''

# From http://effbot.org/zone/element-index.htm
import xml.etree.ElementTree as etree
tree = etree.fromstring(dinner_recipe)

# For invalid HTML use http://effbot.org/zone/element-soup.htm
# import ElementSoup, StringIO
# tree = ElementSoup.parse(StringIO.StringIO(dinner_recipe))

pantry = set(['olive oil', 'pesto'])
for ingredient in tree.getiterator('tr'):
    amt, unit, item = ingredient
    if item.tag == "td" and item.text not in pantry:
        print ("%s: %s %s" % (item.text, amt.text, unit.text))


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

BOARD_SIZE = 8

class BailOut(Exception):
    pass

def validate(queens):
    left = right = col = queens[-1]
    for r in reversed(queens[:-1]):
        left, right = left-1, right+1
        if r in (left, col, right):
            raise BailOut

def add_queen(queens):
    for i in range(BOARD_SIZE):
        test_queens = queens + [i]
        try:
            validate(test_queens)
            if len(test_queens) == BOARD_SIZE:
                return test_queens
            else:
                return add_queen(test_queens)
        except BailOut:
            pass
    raise BailOut

queens = add_queen([])
print (queens)
print ("\n".join(". "*q + "Q " + ". "*(BOARD_SIZE-q-1) for q in queens))


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

import random

guesses_made = 0

name = input('Hello! What is your name?\n')

number = random.randint(1, 20)
print ('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))

while guesses_made < 6:

    guess = int(input('Take a guess: '))

    guesses_made += 1

    if guess < number:
        print ('Your guess is too low.')

    if guess > number:
        print ('Your guess is too high.')

    if guess == number:
        break

if guess == number:
    print ('Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made))
else:
    print ('Nope. The number I was thinking of was {0}'.format(number))


These all run under Python 3. If you are interested in differences between Python 2 and Python 3, please take a look at the previous version of this page.


CategoryDocumentation

SimplePrograms (last edited 2019-11-09 23:29:53 by FrancesHocutt)

Unable to edit the page? See the FrontPage for instructions.