In [1]:
#closure
def adder(outer_argument): # outer function
  def adder_inner(inner_argument): # inner function, nested function
    return outer_argument + inner_argument # Notice outer_argument
  return adder_inner
add5 = adder(5) # a function that adds 5 to its argument
add7 = adder(7) # a function that adds 7 to its argument
print add5(3) # prints 8
print add7(3) # prints 10


8
10

In [4]:
#yield
def concat(a, b) :
    for i in a :
        yield i
    #end for
    for i in b :
        yield i
        
for i in concat([1,2,3], [5,6,7]):
    print i


1
2
3
5
6
7

In [10]:
f = lambda x: x[1]
f((1,2))


Out[10]:
2