Created by Alexander Hernandez / @pori_alex
Join us at sropythonusers@umich.edu
Programming that changes state to complete a task.
a = 0 b = 0 a += 160 # 160 a /= 5 # 4 def do_something(n): b = a + n do_something(10) print b # 42
Describing what a program is rather than how it works.
a = 0 b = a + 160 # 160 c = b / 5 # 4 def do_something(a, b): return a + b d = do_something(c, 10) print d # 42
A shorthand for functions.
# lambda x, y, ...: expression sgn = lambda x: -1 if (x < 0) else 1 if (x > 0) else 0 sgn(-5) # -1 sgn(5) # 1 sgn(0) # 0
Functions that take other functions as arguments, return functions, or both.
The most famous ones are map(), reduce(), filter().
list = [1, 2, 3, 4, 5] def square(x): return x*x squared = map(square, list) # [1, 4, 9, 16, 25] gt5 = filter(lambda x: x > 5, squared) # [9, 16, 25] sum = reduce(lambda x, y: x + 7, gt5) # 23
Functions that take input and produce an output. The same input will always produce the same output, lacking side effects.
square = lambda x: x**2
As opposed to:
power = 2 square = lambda x: x**power print square(2) # 4 power = 0 print square(2) # 1
Syntax that sounds like what it's doing.
i.e.
SELECT * FROM superheroes WHERE city LIKE 'Metropolis';
In Python, this could be:
select('superheroes', where({ 'city': 'Metropolis' }))
Here's a mathematical definition:
An imperative implementation:
def fib(n): a, b = 0, 1 for i in range(0, n): a, b = b, a + b return a
Now let's try this Functionally:
def fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n - 1) + fib(n - 2)
An imperative implementation:
import csv def csvtodict (csvFile, delim): headers = None content = {} reader = csv.reader(open(csvFile), delimiter=delim) i = 1 for row in reader: if reader.line_num == 1: headers = row[0:] else: content[i] = dict(zip(headers, row[0:])) i = i + 1 return content incsv = r"path\to\file" d_csv = csvtodict(incsv, ',') print len(d_csv)
A functional implementation:
import csv load_csv = lambda f, delim: csv.reader(open(f), delimiter=delim) def csvtodict (csvFile, delim): reader = load_csv(csvFile, delim) headers = headers.next() content = map(lambda row: zip(headers, row), reader) return content incsv = r"path\to\file" csv_default_delim = lambda f: csvdict(f, ',') d_csv = csv_default_delim(incsv) print len(d_csv)
Any questions?
Don't forget to join us at sropythonusers@umich.edu