자기계발/Python

[Python] 기본13. 함수 고급(튜플과 람다)

호등 2022. 3. 8. 09:09
반응형

파이썬엔 있는데 다른 언어에 없는 대표적인 기능 '튜플'과 '람다'에 대해 공부해보았다.
튜플은 리스트와 굉장히 비슷하지만 조금 다른 성질을 갖고 있다.

튜플

: 리스트와 매우 유사하지만 리스트와 다르게 결정된 요소를 바꿀 수 없다.
(데이터, 데이터, 데이터, ...)

tuple_test = (10, 20, 30)

print(tuple_test[0]) #출력결과 : 10

#튜플 값 바꾸기 시도 -> 실패
tuple_test[0] = 100 #TypeError 오류 출력!

tuple_test2 = "A", "B", "C", "D"
print("type(tuple_test2): ", type(tuple_test2))
#출력결과 : type(tuple_test2):  <class 'tuple'>

리스트를 선언했을 땐 대괄호를 사용했지만 튜플은 소괄호( )를 사용한다.

위 코드를 보면 튜플 내부의 데이터를 바꾸려고 시도하니 에러가 출력되었고,
괄호 없이도 튜플 선언이 가능하다는 것을 확인할 수 있다.


튜플로 변수의 값 교환

a, b = 10, 20
 
print("교환 전 값 ")
print("a:",a)
print("b:",b)
 
a, b = b, a
 
print("교환 후 값 ")
print("a:",a)
print("b:",b)

a, b = b, a라는 코드만으로 a와 b에 들어있는 데이터를 바꿀 수 있다.


튜플과 함수

def test():
    return (10, 20)

a, b = test()

print(a) #출력결과 : 10
print(b) #출력결과 : 20

튜플을 함수의 리턴값으로 사용하면 여러 개의 값을 리턴하는 것이 가능하다.
2개의 값을 리턴하는 test()함수를 만들고 a, b = test()로 코드를 작성해보면,
a와 b에 각각 한 개의 값이 들어간다.

for i, value in enumerate([1,2,3,4,5,6]):
	print("{}번째 요소는 {}입니다".format(i, value))

추가로 전에 enumerate()함수를 공부했을 때 위 코드처럼 작성을 했었는데
for구문에 쓰인 i, value도 사실 괄호가 생략된 튜플의 형태이다.


람다

: 요즘엔 함수를 매개변수로 전달하는 코드를 많이 사용한다. 파이썬에서 이런 코드를 좀 더 효율적으로 작성할 수 있게 해주는 기능을 말한다.

함수를 매개변수로 전달하는 것부터 람다까지 차근차근 정리해보겠다.

filter( )함수와 map( )함수

함수를 매개변수로 전달하는 대표적인 표준 함수로 map( )과 fiilter( )함수가 있다.
map(함수, 리스트) : 리스트를 함수에 넣어 리턴 된 값을 리스트로 구성해주는 함수
filter(함수, 리스트) :리스트를 함수에 넣어 TRUE인 리턴 값을 리스트로 구성해주는 함수

def power(item):
    return item * item

def under_3(item):
    return item < 3

list_input_a = [1,2,3,4,5]

#map( )함수 사용
output_a = map(power, list_input_a)
print(list(output_a))
#출력결과 : [1, 4, 9, 16, 25]

#filter( )함수 사용
output_b = filter(under_3, list_input_a)
print(list(output_b))
#출력결과 : [1, 2]

출력결과를 list( )함수로 감싸지 않으면
<map object at 0x03862270>처럼
제너레이터(genertaor)로 결과 값이 출력된다.

위 예제를 보면 map 함수와 filter 함수의 사용법을 어렴풋이 이해할 수 있을 것이다.

람다의 개념

매개변수로 더 간단하게 함수를 전달하기 위한 기능이다.
lambda 매개변수: 리턴값

power = lambda x: x * x
under_3 = lambda x: x< 3

list_input_a = [1,2,3,4,5]

#map( )함수 사용
output_a = map(power, list_input_a)
print(list(output_a))

#filter( )함수 사용
output_b = filter(under_3, list_input_a)
print(list(output_b))

def로 함수를 정의하고 return값을 지정해줬던 기존의 함수 형태에 비해 많이 간결해졌다.
이 코드의 결과는 filter( )함수와 map( )함수에서 썼던 코드의 결과와 같다.

사실 람다는 함수를 만들지 않고도 매개변수에 넣는 것이 가능하다.

list_input_a = [1,2,3,4,5]

#map( )함수 사용
output_a = map(lambda x: x*x , list_input_a)
print(list(output_a))

#filter( )함수 사용
output_b = filter(lambda x: x<3, list_input_a)
print(list(output_b))

제곱을 구하는 power( )함수와 3보다 작은 수를 구하는 under_3( )함수를 만들지 않고, 매개변수에 람다를 바로 넣어 더 깔끔하게 만든 경우이다.

람다를 사용함으로써 얻을 수 있는 장점
1. 코드를 더 깔끔하게 작성할 수 있다.
2. 어떤 함수인지 파악하기 위해 다시 스크롤을 올리지 않아도 된다.
이다.

lambda x, y: x * y 처럼 매개변수가 여러 개인 람다도 사용할 수 있다!

반응형