CS156
Chris Pollett
Feb 13, 2012
i = 5 def printi(): i=4 print i printi() # outputs 4 print i #outputs 5 #note without the i=4 assignment would get i=5
def assign_i(): global i i=3 print i #now get 3
a = printi a() # prints 4
Consider: def f(x): return x**3 f(10) #returns 1000 g = lambda x: x**3 #notice don't use return with lambda g(10) #returns 1000 def make_adder (n): return lambda x: x + n f = make_adder(2) g = make_adder(6) print f(42), g(42)
def countdown(n): while n > 0: yield n n -=1 c = countdown(5) print c.next() #prints 5 print c.next() #prints 4 print c.next() #prints 3
import time def tail_log(f): f.seek(0, 2) # 2nd arg: 0 means start of file, 1 means current pos, 2 means end of file while True: line = f.readline() if not line: time.sleep(0.1) # sleep 1/10 of a second continue yield line
def print_matches(text): print "Trying to find", text while True: line = (yield) if text in line: print line p = print_matches("hello") p. next() #prints 'Trying to find hello' p.send("lalalala la") #doesn't print anything p.send("hello world") #prints hello world
Which of the following is true?
for i in range(0, 10): #do something
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
class Stack(object): #this says stack inherits from object a_class_variable = 5 # this var behaves like a Java static var def __init__(self): #self = this in Java self.stack = [] #now stack is a field variable of Stack #in general using self.field_var is how we declare and #instantiate a instance variable def push(self, object): #the first argument of any method self.stack.append(object) # is the object itself def pop(self): return self.stack.pop() @property #properties are attributes that computes its value when accessed def length(self): return len(self.stack)
my_instance = Stack() my_instance.push("hello") print my_instance.length() print isinstance(my_instance, object) #returns True print issubclass(Stack, object) #returns True #type(my_instance) returns Stack ... #etc
class Stack(list): def push(self, object): #could refer to parent by using syntax list.some_method_of_list #or use super(list, self).some_method_of_list self.append(object)
class MyClass: @staticmethod def my_method(): #some code MyClass.my_method() #similar to Java
#load in abstract class module from abc import ABCMeta, abstractmethod, abstractproperty class MyClass: __metaclass__ = ABCMeta # a metaclass is a class object that knows how to # create other class objects. The default metaclass # is type (Python 3, types.ClassType in Python 2). # Here we are assignment ABCMeta # to be used rather than type # In Python 3, write MyClass(metaclass=ABCmeta) @abstractmethod def my_abstract_method(self): pass @abstractproperty def my_abstract_property(self): pass
class Board: def __init__(self): self.board = ["...", "...", "..."] def add(self, player_piece, x, y): if player_piece != "x" and player_piece != "o": raise RuntimeError("Piece must be x or o") row = "" for i in range(3): if i == y: row += player_piece else: row += self.board[x][y] self.board[x] = row def draw(self): for i in range(3): print self.board[i] b = Board() b.add("x", 1, 1) b.draw() print b.add("o", 0, 1) b.draw()