In [ ]:
def binary_search(nums, x):
    s = 0
    e = len(nums) - 1
    
    while s <= e:
        mid = (s + e) / 2
        if nums[mid] == x:
            return mid
        elif nums[mid] > x:
            e = mid - 1
        else:
            s = mid + 1
            # 찾고자 하는 수가 구간안에 없으면 mid값보다 한칸 더 큰값으로 옮겨줌
            
    return -1
        # 찾고자 하는 수가 list에 없으면 -1값으로 변환

nums = [1, 2, 4, 5, 7, 8, 10, 22, 34, 56, 89, 100]
print binary_search(nums, 8)
print binary_search(nums, 1)
print binary_search(nums, 89)
print binary_search(nums, 88)
print binary_search(nums, 100)
print binary_search(nums, 101)

In [ ]:
def factorial(n):
    mul = 1
    for i in range(2, n+1):
        mul *= i
        
    return mul


# assert는 True가 전달되면 아무런 동작을 하지 않고, False가 전달되면 예외 발생
assert(factorial(5) == 120)
assert(factorial(4) == 24)
assert(factorial(1) == 1)

In [ ]:
def recursive_fibonacci(n):
    if n == 1 or n == 2:
        return 1
    
    return recursive_fibonacci(n-1) + recursive_fibonacci(n-2)

print recursive_fibonacci(15)
%timeit recursive_fibonacci(20)

In [ ]:
fib_cache = {}

def recursive_fibonacci_memo(n):
    if n in fib_cache:
        return fib_cache[n]
    else:
        if n == 1 or n == 2:
            fib_cache[n] = 1
        else:
            fib_cache[n] =  recursive_fibonacci_memo(n-2) + recursive_fibonacci_memo(n-1)
            
        return fib_cache[n]

print recursive_fibonacci_memo(15)
%timeit recursive_fibonacci_memo(20)

In [ ]:
def square(x): 
    return x ** 2

lambda x : x**2 #위에 코드를 더 간결하게 1줄로 줄일 수 있는 함수

square2 = lambda x : x**2

print square
print square2

print square(4), square2(4)

In [ ]:
nums = [(1, 2), (9, 5), (8, 4), (7, 6), (10, 2), (4, 5)]

def get_key(item):
    return item[1]

print sorted(nums)
print sorted(nums, key = get_key)
print sorted(nums, key = lambda item : item[1])
print sorted(nums, key = lambda item : item[0])
print sorted(nums, key = lambda item : item[0], reverse = True) #내림차순으로 정렬할 때