파이썬은 map, filter와 같은 함수형 기능을 지원하며 다음과 같은 람다 표현식도 지원한다.
list(map(lambda x:x+10,[1,2,3]))
# [11,12,13]
리스트 컴프리헨션
리스트 컴프리헨션이란 기존 리스트를 기반으로 새로운 리스트를 만들어내는 구문으로, 파이썬 2.0부터 지원되었으며 파이썬의 대표적인 특징이다.
람다 표현식에 map이나 filter를 섞어서 사용하는 것에 비해 가독성이 훨씬 높다.
Ex> 홀수인 경우 2를 곱해 출력하라는 리스트 컴프리헨션
[n*2 for n in range(1,10+1) if n%2 == 1]
# [2, 6, 10, 14, 18]
만약에 리스트 컴프리헨션을 사용하지 않는다면 다음과 같이 작성해야 한다.
a=[]
for n in range(1,10+1):
if n%2 == 1:
a.append(n*2)
파이썬은 리스트만 가능한것이 아니라 딕셔너리도 가능하다.
a={}
for key,value in original.items():
a[key] = value
# 위의 코드를 아래와 같이 바꿀 수 있다
a={key:value for key,value in original.items()}
제너레이터
제너레이터는 루프의 반복 동작을 제어할 수 있는 루틴 형태를 말한다. 예를 들어 숫자 1억 개를 만들어내 계산하는 프로그램을 작성한다고 하였을때 이 경우 제너레이터가 없으면 메모리 어딘가에 만들어낸 숫자 1억 개를 보관하고 있어야 한다. 그러나 제너레이터를 이용하면, 단순히 제너레이터만 생성해두고 필요할 때 언제든 숫자를 만들어낼 수 있다.
기존의 함수는 return 구문을 맞닥뜨리면 값을 리턴하고 모든 함수의 동작을 종료한다. 그러나 yield는 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미로, 중간값을 리턴한 다음 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행된다.
def get_natural_number():
n=0
while True:
n+=1
yield n
이 경우 함수의 리턴 값은 다음과 같이 제너레이터가 된다.
만약 다음 값을 생성하려면 next()로 추출하면 된다. 예를 들어 100개의 값을 생성하고 싶다면 다음과 같이 100번 동안 next()를 수행하면 된다.
g=get_natural_number()
for _ in range(0,100):
print(next(g))
range()
제너레이터의 방식을 활용하는 대표적인 함수로 range() 가 있다. 주로 for 문에서 쓰이는 range() 함수의 쓰임은 다음과 같다.
list(range(5))
# [0,1,2,3,4]
range()는 range 클래스를 리턴하며, for 문에서 사용할 경우 내부적으로는 제너레이터의 next()를 호출하듯 매번 다음 숫자를 생성해내게 된다.
enumerate()
enumerate()는 '열거한다'는 뜻의 함수로, 순서가 있는 자료형(list,set,tuple)을 인덱스를 포함한 enumerate 객체로 리턴한다.
a=[1,2,3,2,45,2,5]
print(list(enumerate(a)))
# [(0, 1), (1, 2), (2, 3), (3, 2), (4, 45), (5, 2), (6, 5)]
이처럼 list()로 결과를 추루할 수 있는데, 인덱스를 자동으로 부여해주기 때문에 매우 편리하게 사용할 수 있다.
for i,v in enumerate(a):
print(i,v)
'알고리즘 > 파이썬 알고리즘' 카테고리의 다른 글
[알고리즘] 에어컨 (0) | 2023.09.11 |
---|---|
[TIL] Python Join 함수 (0) | 2022.07.13 |
모듈, standard library (0) | 2021.05.29 |
사전 (0) | 2021.05.28 |
옵셔널 파라미터 (optional parameter) (0) | 2021.05.20 |