일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 중학수학
- 데이터분석
- 정보처리기사필기
- 혼공머신
- 컴퓨터비전
- 딥러닝
- pandas
- 정보처리기사실기
- 자바
- C++
- 코딩테스트
- 영어공부
- 운영체제
- CSS
- 파이썬라이브러리
- JSP/Servlet
- 컴퓨터구조
- 파이썬
- 정수와유리수
- 중학1-1
- numpy/pandas
- 데이터베이스
- 연습문제
- SQL
- 자바 실습
- 텍스트마이닝
- html/css
- 데이터입출력구현
- CNN
- 머신러닝
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
함수형 프로그래밍 다루기 2 - 순열과 조합, 좌표 정렬하기 본문
이제부터 모든 라이브러리를 학습하지 않고 필요하고 중요하다고 생각되는 부분 위주로 학습하려고 한다.
순서를 생각하며 카드를 뽑으려면? - itertools.permutations
반복 가능 객체 중에서 r개를 선택한 순열을 반환하는 함수이다.
1, 2, 3 숫자가 적힌 3장의 카드에서 두 장의 카드를 꺼내 만들 수 있는 2자리 숫자를 모두 구하려면 어떻게 해야 할까?
3장의 카드 중 순서에 상관없이 2장을 뽑는 경우는 모두 3가지이다. 하지만 순서를 더하면 6가지가 된다. 이 순열은 itertools.permultations()를 사용하면 간단히 구할 수 있다.
만들 수 있는 2자리 숫자는 다음과 같이 모두 6가지이다.
조합
3장의 카드에서 순서에 상관없이 2장을 고르는 조합은 itertools.combinations()를 사용하면 된다.
로또의 모든 가짓수를 구하려면? - itertools.combinations
반복 가능 객체 중에서 r개를 선택한 조합을 이터레이터를 반환하는 함수이다.
1~45 중 서로 다른 숫자 6개를 뽑는 로또 번호의 모든 경우의 수(조합)를 구하고 그 개수를 출력하려면 어떻게 해야 할까?
선택할 수 있는 로또 번호의 가짓수는 8145060가지이다.
순서대로 좌표를 정렬하려면? - functools.cmp_to_key
sorted()와 같은 정렬 함수의 key 매개변수에 함수를 전달할 때 사용하는 함수이다. 단, func() 함수는 두 개의 인수를 입력하여 첫 번째 인수를 기준으로 그 둘을 비교하고 작으면 음수, 같으면 0, 크면 양수를 반환하는 비교 함수이어야 한다.
다음과 같이 2차원 병면 위의 점 N개를 (x, y) 좌표로 구성한 리스트가 있다. y 좌표가 증가하는 순으로 정렬하되 y 좌표가 같으면 x 좌표가 증가하는 순으로 좌표를 정렬하고 이를 출력하는 프로그램을 만들려면 어떻게 해야 할까?
이 문제는 sorted() 함수의 두 번째 key 개개변수에 특별한 방법으로 정렬할 수 있는 함수를 전달하여 해결해야 한다. key에 함수를 전달하려면 functools.cmp_to_key()를 사용한다.
y 좌표 순으로 정렬하되 y 좌표가 같다면 x 좌표 순으로 정렬한다.
기존 함수로 새로운 함수를 만들려면? - functools.partial
하나 이상의 인수가 이미 채워진 새 버전의 함수를 만들 때 사용하는 함수이다.
다음은 입력한 인수의 합과 곱을 choice값에 따라 선택적으로 반환하는 사용자 정의 함수 add_mul()이다.
예를 들어 add_mul('add', 1, 2, 3, 4, 5)를 호출하면 1~5인 합인 15를 반환하고, add_mul('mul', 1, 2, 3, 4, 5)를 호출하면 120이 반환된다. 그렇다면 add(), mul() 함수를 만들려면 어떻게 해야 할까?
이 문제의 일반적인 풀이는 다음과 같다.
하지만 functools.partial()을 사용하면 다음처럼 더 간결하게 코드를 작성할 수 있다.
partial은 이처럼 하나 이상의 인수를 미리 채운 새 버전의 함수를 만 드는데 유용하다.
다양한 기준으로 정렬하려면? - operator.itemgetter
주로 sorted와 같은 함수의 key 매개변수에 적용하여 다양한 기준으로 정렬할 수 있도록 하는 모듈이다.
학생의 이름, 나이, 성적 등의 정보를 저장한 다음과 같은 students 리스트가 있다고 하자.
students 리스트에는 3개의 튜플이 있으며 각 튜플은 순서대로 이름, 나이, 성적에 해당하는 데이터로 이루어졌다. 이 리스트를 나이순으로 정렬하려면 어떻게 해야 할까?
이 문제는 key 매개변수에 itemgetter()를 적용하면 쉽게 해결할 수 있다.
이 코드는 튜플을 기준으로 나이순으로 정렬한 것이다. 이제 딕셔너리일 때도 age를 기준으로 정렬해 보자.
age 순으로 잘 정렬되었다.
학습을 마치고
이렇게 해서 함수형 프로그래밍을 다루는 라이브러리를 학습해 보았다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
운영체제 다루기 - 디버깅용 로그 남기기 및 터미널 프로그램 만들기, 시스템 정보 알아보기 (0) | 2024.10.06 |
---|---|
파일과 디렉터리 다루기 - 디렉터리 구성 및 특정 파일 찾기 (0) | 2024.10.06 |
함수형 프로그래밍 다루기 1 - 순서대로 배정하기 및 키 값으로 데이터 묶기 (1) | 2024.10.06 |
숫자와 숫자 다루기 2 - 분수 계산하기 및 무작위 난수 추출, 평균과 중앙값 구하기 (0) | 2024.10.06 |
숫자와 숫자 다루기 1 - 최대공배수와 최소공배수 모듈 및 소수점 자릿수 표현하기 (0) | 2024.10.06 |