|
Size: 9512
Comment: revert spam
|
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 (' ' + 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_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 (%s%%)' % (name, status, pct) }}} ---- |
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))) }}} ---- |
| 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 -= 112 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.
