반응형
우리가 지금까지 다룬 파이썬 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::..
파일 검증 작업을 하다보면, 다운로드 받은 파일의 무결성(integrity)을 확인하기 위해 해시(hash) 값을 비교하는 경우가 많습니다. 특히 SHA-256 해시는 많은 소프트웨어 배포 사이트에서 표준적으로 제공하고 있는 대표적인 해시 알고리즘 중 하나입니다. 또한 단순히 파일뿐만 아니라, 특정 문자열에 대한 SHA-256 해시값을 얻고자 할 때도 있습니다. 이 글에서는 리눅스, 맥OS, 윈도우 환경에서 SHA-256 해시를 커맨드라인 도구로 간편하게 계산하는 방법을 설명하겠습니다.1. SHA-256 해시란?SHA-256은 SHA-2 알고리즘 계열의 해시 함수 중 하나로, 256비트 길이의 해시값을 생성합니다. 이 값은 일반적으로 16진수(HEX) 형태로 출력되며, 파일이나 문자열의 "지문"으로 사용..
이제까지 우리는 CUDA의 기본 문법, 메모리 계층, 비동기 스트림, 2D 데이터 처리 등 다양한 기초 개념을 다뤄왔습니다. 하지만 이 모든 것이 현업이나 프로젝트에서 활용되기 위해서는 체계적인 빌드 환경과 현대적 C++ 기능과의 자연스러운 결합이 중요합니다. 이번 글에서는 CMake를 통한 빌드 시스템 설정 방법과 C++20/23 기능(Coroutine, Concept, Constexpr, Lambda 개선 등)을 CUDA 코드와 융합하여 더 깔끔하고 유지보수하기 쉬운 코드를 만드는 방법을 살펴보겠습니다.CMake로 CUDA 빌드 환경 현대적으로 관리하기기본 구조 복습이전 글에서 간단히 소개했듯이, CMake는 CUDA를 별도의 언어로 인식하고, project(... LANGUAGES CUDA CXX)..
이전 글에서는 구조체, 열거형, 패턴 매칭, 모듈 시스템을 통해 러스트의 타입 정의와 코드 구조화를 살펴보았습니다. 이제는 러스트에서 추상화와 다형성을 어떻게 구현하는지 알아볼 차례입니다. C++ 개발자라면 ‘템플릿(Template)’과 ‘가상 함수(Virtual function)’, ‘인터페이스(Interface)’ 등을 통해 제네릭 프로그래밍, 다형성을 달성하는 것에 익숙할 텐데요. 러스트는 이와 유사하지만 좀 더 정교하고 명확한 개념인 트레이트(Trait)와 제네릭(Generic)을 제공합니다.트레이트(Trait)란 무엇인가?러스트에서 트레이트는 특정 타입이 "이런 기능을 갖추고 있다"는 것을 표현하는 인터페이스 역할을 합니다. C++에서 순수 가상 함수만 갖는 클래스(인터페이스)나 개념(Conce..