
# default and keyword function parameters

def foo(a,b=0, c=True):
    if c == True:
        return a + b
    else:
        return a - b


# BUT BE CAREFUL!
# E.g. see what happens if do bar(5) and then bar(-5)
#
def bar(num, numList = [100, -100]):
    if num > 0:
        numList[0] = numList[0] + num
    else:
        numList[1] = numList[1] + num       
    return numList


# sorting dictionary items

d = {'free': 23, 'you': 50, 'go': 10, 'zoo': 1}

tl = list(d.items())
# yields tl = [('free', 23), ('you', 50), ('go', 10), ('zoo', 1)]

def item1(element):
    return element[1]

sorted(tl, key = item1)

sorted(tl, key = lambda item: item[1], reverse = True)

(lambda x,y: x + y)(2, 3)

myAdd = lambda x, y: x + y

def generateTimesNFunc(n):
    return lambda x: n*x


# zip

zippedStuff = zip([1,2,3], ['a', 'b', 'c'])

zipObj = zip([1, 2, 3], ['uno', 'dos', 'tres'], ['mot', 'hai', 'ba'])







