파이썬/파이썬 입문 공부일지

파이썬 공부일지 19. 함수 활용 (튜플, 람다)!

Tomitom 2022. 10. 18. 17:26
반응형

 

다음으로 함수 관련하여 편하게 쓸 수 있는 기능들로 튜플과 람다가 있습니다. 

 

1. 튜플

리스트와 비슷한 자료로 리스트와 다른 점으로는 한 번 결정된 요소는 바꿀 수 없다는 것입니다.

a = [ 요소, 요소, 요소 ] -> 리스트 

a = ( 요소, 요소, 요소 ) -> 튜플 

리스트는 [] 대괄호를 쓰지만 튜플은 소괄호() 를 씁니다. 

(소괄호는 튜플 뿐만 아니라 연산식을 만들 때도 씁니다.)

그 안에 여러개의 자료를 넣는데 쉼표로 구분합니다. 

리스트와 동일하게 인덱싱을 할 수 있습니다. 

튜플과 리스트는 생김과 기능이 비슷하지만 몇 가지 차이가 있습니다. 

- 튜플은 값의 변경이 불가능하지만, 리스트는 값의 변경이 가능합니다. 

 

튜플은 값의 변경이 불가능해요
리스트는 값의 변경이 가능합니다.

 

- 튜플은 요소를 하나만 가질 수 있는 리스트와는 달리 

한개의 리스트를 가지기 위해서는 공란을 만들어야 합니다. 

리스트를 하나만 적을 때에는 값을 int, 즉 숫자를 괄호로 감싼 것으로 이해합니다. 

 

 

괄호 안에 요소 하나를 넣고 공란을 넣어야 튜플로 인식합니다.

리스트와 튜플은 할당 구문에 있어서 한꺼번에 변수를 여러개를 만들 수 있습니다.

 

리스트는 대괄호 [ ] 가 없으면 값을 할당하지 못하지만 

튜플은 괄호를 생략해도 만들 수 있습니다.

괄호가 없는 값들은 모두 튜플로 인식이 되어요. 

 

 

구문을 편리하게 작성할 수 있어요. 

튜플은 값을 교환할 때 편리하게 쓸 수 있는데 

a, b = b,a  라는 코드만으로 값을 바꿀 수 있습니다. 

튜플은 주로 함수의 return 에 많이 사용합니다.

함수에서 return 으로 튜플을 사용하면 여러 개의 값을 한꺼번에 출력할 수 있기 때문이에요. 

위 캡쳐에 있는 함수를 자세히 보면 

 

def test() :       # test() 함수를 만들어줍니다. 
    return "사랑", "용기", "희망"         # 사랑, 용기, 희망이라는 말을 한꺼번에 리턴합니다. 이때 괄호가 없는 튜플이 쓰입니다.

a,b,c = test()    -> 각 변수를 test() 함수에 적용을 시켰을 때, 리턴된 값들이 차례로 대응됩니다. 
 

결과값은 ! 
a
'사랑'
b
'용기'
c
'희망'

 

여러개의 값을 한꺼번에 출력하는 것으로 중요한 함수 하나를 더 알고 갈게요. 

바로 enumerate() 함수 인데요. 

for 반복문과 조합해서 유용하게 쓰입니다. 

 

example_list = ["자료 a", "자료b", "자료c"]  

위의 리스트가 있을 때 enumerate() 함수는 각 자료별로 몇 번째 인덱스에 있는지를 확인해줍니다. 

 

for i, value in enumerate(example_list):

    print(f"{i}번째 요소는 {value}입니다.") 

반복문에서 enumerate() 함수를 사용하면 for 과 in 사이에 반복 변수를 두 개 넣을 수 있습니다. 

 

여기에서 i 와 value 의 형태는 (i, value) 튜플에서 괄호를 벗겨낸 형태라고 보시면 됩니다. 

 

 

 


2. 람다

 

다음으로 람다입니다. 

람다를 배우기 전에는 효율적으로 작성할 수 있는 몇 가지 개념을 같이 알아볼게요. 

 

매개 변수로 함수 전달하는 것을 알아볼게요. 

함수를 두 개 만들었을 때 함수 속에 함수를 쓰는 경우예요. 

즉, 매개 변수에 함수를 직접 넣을 때를 말합니다. 이것을 콜백함수라고 해요. 

 

콜백 함수 : 함수에 전달하는 함수 , 자기 자신을 다시 불러오는 함수 

call 함수 속에 3번을 반복하는 반복문을 넣어주고 

say 함수 속에 안녕하세요를 출력하는 함수를 넣어주었습니다. 

그리고 call 함수 속에 say를 불러서 실행했어요. 

 

다음으로 filter() 와 map() 함수를 알아봅니다.

함수를 매개변수로 사용하는 가장 대표적인 표준 함수예요. 

 

map() 함수는 리스트의 요소를 함수에 넣고, 리턴된 값으로 새로운 리스트를 생성하는 함수입니다. 

map(함수, 리스트) -> 리스트에 있는 요소들을 함수에 대입해서 새로운 리스트를 만들어요. 

 

 

 

 

filter() 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True 불값일 경우에만 새로운 리스트를 구성합니다. 

filter(불조건문함수, 리스트) -> 리스트에 있는 요소들이 참인 경우 새로운 리스트를 만들어요.

 

 

map() 과 filter() 는 형태가 없는 것으로 값 그 자체를 자료로 사용하는 함수입니다.

이를 제너레이터 유형이라고 부릅니다. 

제너레이터(generator, 여러개의 값을 필요에 따라 반환yield할 수 있는)는 여러 개의 값을 순차적으로 반환할 수 있는 이터러블(iterable, 반복가능한) 객체를 만드는 유형 입니다. 

 

즉 map은 리스트를 가공한 결과이고, filter는 리스트를 필터링한 결과이며

이것은 모두 이터러블 객체가 됩니다.

 

# 함수 선언

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)       -> power 함수를 부를 때에는 () 괄호를 쓰지 않고 바로 부릅니다. 콜백함수예요. 
print(list(output_a))

# filter() 함수 사용
output_b = filter(under_3, list_input_a)     -> under_3 함수도 마찬가지로 () 괄호를 쓰지 않습니다. int(list(output_b))

 

 

이렇게 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것은 코드가 길어지고 번거로운 것이 있기 때문에 

조금 더 간단하게 함수를 선언하기 위해 람다 함수를 만들었습니다. 

 

람다lambda의 형태

lambda 매개변수 : 리턴값

 

매개변수를 하나 받아서 값을 만드는 방법입니다. 

 

 

# 함수를 선언
power = lambda a : a*a    -> a라는 매개변수를 받아서 : 뒤에 있는 a*a 의 값을 리턴하는 power 변수를 선언합니다. 
under_3 = lambda a : a<3

# 변수를 선언
list_input_a = [1,2,3,4,5]

# map() 함수를 사용
output_a = map(power, list_input_a)  -> list_input_a 리스트에 있는 값들을 차례로 power 함수에 대입하고 그 결과값으로 새로운 리스트인 output_a 리스트를 만들어요. 
 
print(list(output_a))
print()

# filter() 함수를 사용
output_b = filter(under_3, list_input_a)  -> list_input_a 리스트에 있는 값들을 차례로 under_3 함수에 대입해서 그 결과값들만 필터링해서 새로운 리스트인 list_input_a 리스트를 만들어요. 
 
print(list(output_b))


 
 
 
이 경우 lambda 함수를 따로 선언하기 때문에 코드가 길어지기 때문에 인라인 람다로 inline lambda 로 
직접 매개변수에 곧바로 넣어보겠습니다. 
 



# 변수를 선언
list_input_a = [1,2,3,4,5]

output_a = map(lambda a : a*a, list_input_a)
print(list(output_a))
print()

output_b = filter(lambda a : a<3, list_input_a)
print(list(output_b))
 
따로 선언을 하는 것보다 조금 더 간결하게 작성할 수 있고, 
어떤 함수인지 따로 찾아보지 않아도 곧장 확인할 수 있다는 점에서 편리합니다. 
 

결과값은 동일합니다. 

 

여기까지 튜플과 람다에 대해서 정리해보았습니다! 

카카오 데이터 센터가 먹통이 되는 바람에 티스토리도 로그인이 안 되어서 오늘에서야 정리하게 되었네요 ㅠㅜ 

다들 열공하세요~ 

반응형