



# 람다 표현식 (= 이름 없는 함수)
# 람다 표현식을 이용하면 함수를 간단하게 작성할 수 있음
# 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징
# lambda 입력으로 받을 매개변수 : 함수의 반환 값

def add(a, b):
    return a + b

# 일반적인 add() 메서드 사용
print(add(5, 6))    # 11

# 람다 표현식으로 구현한 add() 메서드   
print((lambda a, b: a + b)(5, 6))   # 11


# 어떠한 함수 자체를 입력으로 받는 또 다른 함수가 존재하는 경우
# 기능이 매우 간단한 함수를 한 번 사용하고 말 경우
# 이러한 경우에서 매우 유용하게 사용






# 람다 표현식 예시 1: 내장 함수에서 자주 사용되는 람다 함수
# 오름차순 정렬을 위해 sorted() 내장 함수 사용
# sorted(정렬할 데이터, key = 정렬 기준)

array = [('하니', 50), ('초코', 32), ('효진', 78)]


def my_key(x):    # 특정 튜플 원소 x가 있을 때
    return x[1]   # 튜플의 두 번째 원소를 기준으로 정렬을 수행하도록 정렬 기준 반환

print(sorted(array, key = my_key))   # [('초코', 32), ('하니', 50), ('효진', 78)]


print(sorted(array, key = lambda x : x[1])) # [('초코', 32), ('하니', 50), ('효진', 78)] 
                  # key = lambda x : x[1]
                  # 튜플(또는 리스트)와 같은 원소가 있을 때, 
                  # 거기에서 두 번째 원소를 기준으로 정렬을 수행해라






# 람다 표현식 예시 2: 여러 개의 리스트에 동일한 규칙을 가진 하나의 함수를 적용

# map() 내장 함수 => 각각의 원소에 어떠한 함수를 적용하고자 할 경우 사용
# map(적용할 함수, 반복 가능한 자료형<리스트, 튜플 등>)
# map 함수의 반환 값은 map객체 이기 때문에 해당 자료형을 list 혹은 tuple로 형 변환시켜주어야 함.
# 두 번째 인자로 들어온 반복 가능한 자료형을 첫 번째 인자로 들어온 함수에 하나씩 집어넣어서 함수를 수행.

# list(데이터) 내장 함수 => 특정한 데이터를 리스트의 형식으로 반환


list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]

result = map(lambda a, b: a + b, list1, list2)
           # lambda a, b: a + b
           # 매개변수 a, b가 주어졌을 때 a + b 를 반환하는 함수 
           # ==> 이 함수를 list1 과 list2 에 적용
          
# list1 과 list2의 매 원소를 하나씩 확인하면서 각각의 원소를 lambda식의 매개변수 a, b로 전달
# 각각 위치에 맞는 원소에 대해 더하기 연산 수행
# 결과를 map객체로 반환

print(list(result))    # map반환을 list 로 변환   [7, 9, 11, 13, 15]
           




