반응형
여러분, 우리는 지금까지 파이썬 itertools와 more-itertools의 다양한 기능을 C++20/23 문법으로 흉내 내는 방법을 살펴보며, 파이썬스러운 추상화를 C++에서 어떻게 구현할 수 있는지 탐구해왔습니다. 이번 글에서는 unique_everseen, unique_justseen, 그리고 powerset를 C++로 옮겨보며, 더욱 풍부한 반복 패턴을 구현하는 방법을 알아보겠습니다.먼저 파이썬에서 이들 API를 간단히 살펴볼게요.from more_itertools import unique_everseen, unique_justseenfrom itertools import chain, combinations# unique_everseen(iterable)# 지금까지 본 적 없는 원소만 내보냄 ..
여러분, 지난 글들에서 우리는 파이썬 itertools와 more-itertools의 다양한 기능을 C++20/23 문법으로 흉내내는 방법을 탐구해왔습니다. 이번에는 grouper, intersperse, flatten이라는 세 가지 기능을 살펴보며, C++로도 충분히 파이썬스러운 추상화를 구현할 수 있음을 확인해보겠습니다. 먼저 파이썬에서의 해당 API를 간단히 살펴볼게요. grouper, intersperse, flatten는 more-itertools나 itertools 관련 라이브러리로 자주 사용할 수 있는 패턴입니다.from more_itertools import grouper, intersperse, flatten# grouper(iterable, n, fillvalue=None)# itera..
그동안 다양한 itertools 기능을 C++로 옮기는 방법을 살펴봤습니다. 파이썬 itertools는 시퀀스를 다루는 멋진 아이디어를 끊임없이 제공하는데, 이번에는 chain.from_iterable와 batched 두 가지를 살펴보려 합니다. 특히 batched는 파이썬 3.11에서 새롭게 추가된 함수로, 이 역시 매력적인 기능입니다. 먼저 파이썬에서 이 두 함수를 간단히 소개해볼게요.from itertools import chain, batched# chain.from_iterable(iterable_of_iterables)는 이중 iterable을 평탄화# 예: [[1,2],[3,4,5],[6]] -> 1,2,3,4,5,6list_of_lists = [[1,2],[3,4,5],[6]]for x i..
우리가 지금까지 다룬 파이썬 itertools 함수들 외에도, 파이썬에서 제공하는 편리한 반복 툴이 여전히 많이 남아 있습니다. 이번 글에서는 그중에서도 자주 쓰이는 세 가지를 골라봤습니다. 먼저, 파이썬으로 몇 가지 예제를 보여드릴게요:from itertools import count, zip_longest, pairwise# count는 start부터 step 간격으로 무한히 증가하는 숫자를 생성for i in count(10, 2): if i > 20: break print(i, end=' ') # 출력: 10 12 14 16 18 20# zip_longest는 가장 긴 이터러블이 끝날 때까지 묶음을 만들고, 부족한 곳은 fillvalue로 채워줌list_a = [1, 2,..
안녕하세요! 지난 글들에서 우리는 파이썬 itertools의 다양한 기능들을 C++20/23 문법과 Ranges 라이브러리, 그리고 다양한 기법을 활용해 “파이썬스러운” 스타일로 구현하는 시도를 해왔습니다. 이제 꽤 많은 기능을 다뤘죠. 이번에는 아직 소개하지 않았던 네 가지를 살펴보겠습니다:compress(data, selectors): data와 selectors를 나란히 순회하면서 selectors가 참일 때만 data의 원소를 내보냅니다.filterfalse(predicate, iterable): filter의 반대 버전으로, predicate가 거짓일 때만 원소를 내보냅니다.starmap(function, iterable_of_iterables): 각 원소가 튜플(혹은 리스트)인 이터러블을 받아..
여러분, 지난 글들에서는 파이썬 itertools의 꽤 많은 기능을 C++에서 “파이썬스럽게” 흉내 내보았습니다. 이제 남은 인기 있는 기능 중 몇 가지를 더 살펴보고, 이 시리즈를 어느 정도 마무리할 때가 된 듯하네요. 이번에는 cycle, repeat, islice, tee 네 가지를 다뤄보겠습니다.cycle(iterable): 주어진 이터러블을 무한히 반복시키는 제너레이터입니다. 파이썬에서는 cycle([1,2,3]) 하면 1,2,3,1,2,3,1,2,3... 끝없이 이어집니다.repeat(elem, n=None): 특정 원소를 n번(또는 무한히) 반복하는 제너레이터입니다.islice(iterable, start, stop, step): 이터러블에서 특정 범위만 슬라이싱해주는 함수입니다. 파이썬의 ..
안녕하세요! 지난 글들에서 우리는 파이썬 itertools의 다양한 기능—range, enumerate, zip, map, filter, chain, takewhile, dropwhile, accumulate, groupby—를 C++에서도 나름 “파이썬스럽게” 구현하거나 표현하는 방법을 두루 살펴봤습니다. 이번에는 itertools의 대표적인 조합론적(iteration over combinations) 함수들인 product, permutations, combinations를 살펴보려고 합니다. 이 함수들은 파이썬에서 꽤 자주 쓰입니다. 예를 들어 product([1,2],[3,4])는 (1,3), (1,4), (2,3), (2,4)를 만들어내고, permutations([1,2,3], 2)는 (1,2..
여러분, 지난 글들에서 우리는 C++에서 파이썬의 range, enumerate, zip, map, filter, chain, takewhile, dropwhile 등을 흉내 내는 방법을 쭉 살펴봤죠. 이제는 또 다른 파이썬 itertools의 매력적인 부분으로 넘어가려고 합니다. 바로 accumulate(파이썬 itertools의 accumulate), 그리고 groupby입니다. accumulate는 요소들을 순회하면서 누적 합이나, 누적 연산 결과를 차곡차곡 모아줍니다. 파이썬에서는 itertools.accumulate([1,2,3,4], operator.mul) 이렇게 사용해 곱셈 누적을, operator.add를 사용해 합 누적을 손쉽게 할 수 있습니다. C++에도 std::accumulate라..
앞선 글들에서 우리는 파이썬의 range, enumerate, zip, map, filter와 같은 편리한 함수형 API를 C++20/23 문법과 Ranges 라이브러리 등을 통해 “파이썬스럽게” 구현하는 방법을 살펴보았습니다. 이번 글에서는 한 단계 더 나아가, 파이썬의 itertools 라이브러리가 제공하는 몇 가지 대표적인 툴을 C++ 스타일로 흉내 내보려 합니다. itertools는 파이썬에서 반복 가능한(iterable) 시퀀스를 다루는 데 매우 유용한 툴셋을 제공합니다. 그중에서도 chain, takewhile, dropwhile는 다양한 컨테이너나 이터러블을 직관적이고 유연하게 다룰 수 있게 해줍니다. 글의 구성은 다음과 같습니다:일반적인 C++ 구현 (Before): 파이썬 chain, t..
앞선 글들에서 우리는 파이썬의 range, enumerate, zip와 유사한 C++ 구현 방식을 살펴보았습니다. 파이썬의 직관적 문법을 C++20/23의 언어와 라이브러리 기능들을 통해 비교적 쉽게 재현할 수 있음을 확인했죠. 이번 글에서는 파이썬에서 자주 사용하는 함수형 스타일의 API인 map과 filter를 C++에서 어떻게 “파이썬스럽게” 구현할 수 있는지 다뤄보겠습니다. 파이썬의 map(function, iterable), filter(predicate, iterable)를 C++20/23에서 비슷한 느낌으로 쓸 수 있다면, 복잡한 로직을 더 간결하고 깔끔하게 표현할 수 있습니다. 글의 구성은 다음과 같습니다:일반적인 C++ 구현 (Before): 람다, std::transform, std::..