제너레이터 표현식.
제너레이터 표현식은 지능형 리스트의 느긋한 버전으로 리스트를 생성하는 대신, 필요에 따라 항목을 느긋하게 생성하는 제너레이터를 반환하므로 지능형 리스트가 리스트 팩토리라면, 제너레이터 표현식은 제너레이터 팩토리라고 생각할 수 있다.
제너레이터 표현식은 제너레이터를 생성하고, 이 표현식을 사용하면 Sentence 클래스의 코드를 더 짧게 만들 수 있다.
제너레이터 표현식은 파이썬에서 간결하게 제너레이터를 생성할 수 있는 방법 중 하나로, 반복 가능한 객체를 생성하는데 사용된다.
제너레이터는 리스트 컴프리헨션과 유사하지만, 제너레이터 표현식은 결과를 한꺼번에 리스트에 저장하는 대신, 필요할 때 마다 값을 반환한다. 이는 메모리를 절약하고 효율적인 반복을 가능하게 한다.
(expression for item in iterable if condition)
expression -> 각 항목에 대해 평가될 표현식이다.
item -> 반복 가능한 객체(iterable)에서 추출된 항목
iterable -> 반복 가능한 객체(리스트, 튜플, 집합 등)
condition -> 필터링 조건, 해당 조건이 True일 때만 표현식 평가
제너레이터 표현식은 리스트 컴프리헨션과 유사하지만, 대괄호 '[]' 대신에 괄호 '()' 를 사용한다. 또한 제너레이터 표현식은 값들을 한꺼번에 리스트에 저장하지 않고, 필요할 때마다 값을 생성하므로 메모리를 효율적으로 사용할 수 있다.
Example.
# 리스트 컴프리헨션
list_comp = [x ** 2 for x in range(5)] # [0, 1, 4, 9, 16]
# 제너레이터 표현식
gen_exp = (x ** 2 for x in range(5)) # 제너레이터 객체 생성
# 각 항목에 대한 제곱을 한꺼번에 리스트에 저장
print(list_comp) # 출력: [0, 1, 4, 9, 16]
# 필요할 때마다 값을 생성하여 사용
for value in gen_exp:
print(value) # 출력: 0, 1, 4, 9, 16
위의 예시에서, 리스트 컴프리헨션은 리스트를 한꺼번에 생성하지만, 제너레이터 표현식은 제너레이터 객체를 생성하여 필요할 때마다 값을 생성한다.
회고
백준 [암호 만들기] 문제를 풀다가 코드를 간단하게 만들고자 찾아보던 중 제너레이터 표현식을 사용하면서 글을 정리하게 됐다.
주어진 글자 조합으로 암호를 만드는 문제인데 적어도 모음 1 , 자음 2 이 포함되어야 하기때문에 모음수를 새기 위해서
vowel_count = sum(1 for char in comb if char in vowels)
다음과 같이 제너레이터 표현식을 썼는데 우선 comb는 문자열이고 이 comb에서 모음의 갯수를 세어야 했다. vowels는 중복이 없는 집합(set)이고, comb안의 문자가 집합안에 속하는지를 확인하고, 속한다면 1을 반환해서 vowel_count에 1을 합하게 된다.
이건 여담인데 , 처음에 받은 array 에서 sort를 안해줬더니 가차없이 틀렸다고 나왔다. 조합은 하나씩만 뽑으니까,, 일단 뽑아놓으면 알아서 자리 찾아갈줄,, ㅎ 작은 조건 하나하나 보는 버릇을 키워야겠다,,, 초중딩시절에도 이런 자잘자잘한거를 잘 놓쳐서 1번 틀리고 이랬는데,, 하아아ㅏ앙아아아아ㅏ
'알고리즘 > Python' 카테고리의 다른 글
[python] 백준 2447 : 별 찍기 -10 (재귀) (0) | 2024.02.21 |
---|---|
[python] 백준 4779 : 칸토어 집합 (재귀) (0) | 2024.02.19 |
[python] 백준 1541 : 잃어버린괄호 (그리디) (0) | 2024.02.15 |
[python] 백준 6603 : 로또 (combination, 백트랙킹) (0) | 2024.02.14 |