Writing Solid Code

Document Sample
Writing Solid Code Powered By Docstoc
					Writing Solid Code
Introduction to Python

Program 1
 

python -c "print 'Hello World' “ python -c "import time; print time.asctime()“ Start an interactive session:
◦ python –v
 help(command/expression)



Unix Executable Scripts


Most portable version:
◦ #!/usr/bin/env python
$ cat first.py #!/usr/bin/env python # A comment print 'Hello World„ print 2**100 $ ./first.py Hello World 1267650600228229401496703205376

$ chmod a+x first.py

Basic Elements
Keywords: and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while with yield  Operators: + - * / % ** // << >> & | ^ ~ < <= > >= <> != ==  Delimiters: ( ) [ ] { } , : . ' = ; += -= *= /= //= %= &= |= ^= >>= <<= **=


Data Types
 

All data values are objects
◦ type(obj) returns the type.

Numbers
◦ Integer: 23, 027 (octal), 0xDA5 (hex) ◦ Floating points : 1.00, 1.0e2 ◦ Complex numbers: 5+6j

Data Types


Sequences
◦ Iterables: All sequences are iterable. (for) ◦ Strings:
 Can use “” or „‟ to specify. “abc” „abc‟ (Same thing.) Unmatched ones can occur within the string. “matt‟s”  Use triple double-quotes for multi-line strings or strings than contain both „ and “ inside of them: “““a„b“c”””  Many Methods built into the string, for example: “hello”.upper() gives „HELLO‟

◦ Tuples
 (x,y)  (100,200,300)

Sequences


Lists
◦ [42, 3.14, „hello‟] ◦ list(„wow‟) gives [„w‟,‟o‟,‟w‟]



Dictionaries ( key:value pairs ) uses Hash.
◦ D = { „x‟ : 42, „y‟:3.14, „z‟:7} ◦ {1:2 , 3:4} ◦ A single dictionary can store values of different types ◦ D[„x‟] is 42. ◦ del D[„x‟] removes the key from D.

Sequences


Concatenation:
◦ S1 + S2 ◦ S1 * n gives n copies of S1 concatenated.



Membership
◦ x in S : tests to check whether x is in S. ◦ x not in S : Guess? ◦ For strings: x in S means if x is a substring of S



Indexing
◦ x = [1,2,3,4] then x[1] is 2 and x[-1] is 4

Sequences


Slicing a sequence:
◦ ◦ ◦ ◦ ◦ S[i:j]: from item i (included) to item j (excluded) x = [1,2,3,4] x[1:3] # [2, 3] x[1:] # [2, 3, 4] x[:2] # [1, 2]

List Methods
Method Nonmutating methods L.count(x) Returns the number of items of L that are equal to x. Returns the index of the first occurrence of an item in L that is equal to x, or raises an exception if L has no such item. Description

L.index(x)

List Methods
Mutating methods L.append(x) L.extend(s) Appends item x to the end of L ; e.g., L[len(L):]=[x]. Appends all the items of iterable s to the end of L; e.g., L[len(L):]=s. Inserts item x in L before the item at index i, moving following items of L (if any) "rightward" to make space (increases len(L) by one, does not replace any item, does not raise exceptions: acts just like L[i:i]=[x]). Removes from L the first occurrence of an item in L that is equal to x, or raises an exception if L has no such item.

L.insert(i, x)

L.remove(x)

List Methods
Method Description Returns the value of the item at index i and removes it from L; if i is omitted, removes and returns the last item; raises an exception if L is empty or i is an invalid index in L. Reverses, in place, the items of L. Sorts, in place, the items of L, comparing items pairwise via function f; if f is omitted, comparison is via the built-in function cmp. Sorts, in-place, the items of L, comparing items pairwise via the function passed as cmp (by default, the built-in function cmp). When argument key is not None, what gets compared for each item x is key(x), not x itself. L.pop([i])

L.reverse( ) L.sort([f]) (2.3)

L.sort(cmp=cmp, key=None, reverse=False)(2.4)

List Methods
 >>> a + [„whites'] [„blend','eggs„,2,234,„whites']  >>> a.append('!') [„blend','eggs„,2,234,'!']  >>> 2*a [„blend','eggs',2,234,'!',„blend','eggs',2,234,'!']

Dictionary Methods
Nonmutating Methods D.copy( ) Returns a shallow copy of the dictionary (a copy whose items are the same objects as D's, not copies thereof) Returns TRue if k is a key in D; otherwise, returns False, just like k in D Returns a new list with all items (key/value pairs) in D

D.has_key(k) D.items( ) D.keys( )
D.values( ) D.iteritems( ) D.iterkeys( ) D.itervalues( ) D.get(k[, x])

Returns a new list with all keys in D
Returns a new list with all values in D Returns an iterator on all items (key/value pairs) in D Returns an iterator on all keys in D Returns an iterator on all values in D Returns D[k] if k is a key in D; otherwise, returns x (or None, if x is not given)

Dictionary Methods
Mutating Methods D.clear( ) D.update(D1) D.setdefault(k[, x]) Removes all items from D, leaving D empty For each k in D1, sets D[k] equal to D1[k] Returns D[k] if k is a key in D; otherwise, sets D[k] equal to x and returns x Removes and returns D[k] if k is a key in D; otherwise, returns x (or raises an exception if x is not given) Removes and returns an arbitrary item (key/value pair)

D.pop(k[, x])
D.popitem( )

Control Flow


if expression:
statement(s) elif expression: statement(s) elif expression: statement(s) ... else: statement(s)

Control Flow


if x < 0: print "x is negative" elif x % 2: print "x is positive and odd" else: print "x is even and non-negative"

Control Flow : while
x = 64 count = 0 while x > 0: x = x // 2 # truncating division count += 1 print "The approximate log2 is", count # if count == 6: break

Control Flow : for
for target in iterable: statement(s)

for letter in "ciao": if letter == „c‟: continue print "give me a", letter, "...“ for key, value in d.items( ): if not key or not value: del d[key] for x in range(1,5): print x # output: 1 2 3 4 # cannot use iteritems # keep only true keys and values

Sample Code
#!/usr/bin/env python import string, sys # If no arguments were given, print a helpful message if len(sys.argv)==1: print 'Usage: celsius temp1 temp2 ...' sys.exit(0) # Loop over the arguments for i in sys.argv[1:]: fahrenheit=float(string.atoi(i)) celsius=(fahrenheit-32)*5.0/9.0 print '%i\260F = %i\260C' % (int(fahrenheit), int(celsius+.5))

Functions
def function-name(parameters): statement(s) def double(x): return x*2 Calling Functions in python function-object(arguments) print double(432) def f(x, y): x = 23 y.append(42)

a = 77 b = [99] f(a, b) print a, b

Import statement
A Typical python program is made up of several source files.  Each source file corresponds to a module.  “import” keyword allows to include other modules into a python program.  Modules


◦ ◦ ◦ ◦ ◦

sys: stdin, stderr, argv os: system, path string: split re: match compile math: exp, sin, sqrt, pow

Calling External programs


import os
◦ subprocess.Popen(["ls", "-la"]).wait()

Sample Program
# average4.py # A program to average a set of numbers # Illustrates sentinel loop using empty string as sentinel def main(): sum = 0.0 count = 0 xStr = raw_input("Enter a number (<Enter> to quit) >> ") while xStr != "": x = eval(xStr) sum = sum + x count = count + 1 xStr = raw_input("Enter a number (<Enter> to quit) >> ") print "\nThe average of the numbers is", sum / count

Output
Enter Enter Enter Enter Enter Enter Enter a a a a a a a number number number number number number number (<Enter> (<Enter> (<Enter> (<Enter> (<Enter> (<Enter> (<Enter> to to to to to to to quit) quit) quit) quit) quit) quit) quit) >> >> >> >> >> >> >> 34 23 0 -25 -34.4 22.7

The average of the numbers is 3.38333333333

Sample Program
# average5.py # Computes the average of numbers listed in a file. def main(): fileName = raw_input("What file are the numbers in? ") infile = open(fileName,'r') sum = 0.0 count = 0 for line in infile.readlines(): sum = sum + eval(line) count = count + 1 print "\nThe average of the numbers is", sum / count

Sample Program
# average6.py # Computes the average of numbers listed in a file. def main(): fileName = raw_input("What file are the numbers in? ") infile = open(fileName,'r') sum = 0.0 count = 0 line = infile.readline() while line != "": sum = sum + eval(line) count = count + 1 line = infile.readline() print "\nThe average of the numbers is", sum / count

Assignment for today


Implement:

closest_pair([(0,0),(7,6),(2,20),(12,5),(16,16) ,(5,8),(19,7),(14,22),(8,19),(7,29),(10,11),(1 ,13)]) returns: (7,6),(5,8)

Should run in O(nlogn)

Pointers
 

Learn Python in 10 minutes:
◦ http://www.poromenos.org/tutorials/python

Dive into Python
◦ http://www.diveintopython.org/