클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

파이썬 날개 달기 8 - 표준 라이브러리 본문

프로그래밍 언어/파이썬

파이썬 날개 달기 8 - 표준 라이브러리

huenuri 2024. 9. 8. 05:34

 

전세계의 파이썬 고수들이 만든 유용한 프로그램을 만들어놓은 것이 파이썬 표준 라이브러리이다. '라이브러리'는 도서관이라는 뜻 그대로 원하는 정보를 찾아보는 곳이다. 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 알면 된다.

이를 위해 어떤 라이브러리라 존재하고 어떻게 사용하는지 알아야 한다. 자주 사용되고 꼭 알아 두면 좋은 라이브러리를 중심으로 하나씩 살펴보자.


 

 

 

1. datetime.date

연, 월, 일로 날짜를 표현할 때 사용하는 함수이다.

 

이렇게 두 날짜의 차이를 구할 수 있다. 요일도 구할 수 있다.

 

 

0은 월요일이고 1은 화요일이 된다.


 

 

 

2. time

시간과 관련된 time 모듈에는 함수가 매우 많다. 그중 가장 유용한 몇 가지만 알아보자.

 

time.time

UTC(협정 세계 표준시)를 사용하여 현재 시간을 실수 형태로 리턴하는 함수이다. 1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 초 단위로 리턴해준다.

 

 

time.localtime

time.time()이 리턴한 실수값을 사용해서 연, 월, 일, 시, 분, 초, ... 의 형태로 바꾸어 주는 함수이다.

 

 

 

time.asctime

time.localtime이 리턴된 튜플 형태의 값을 인수로 받아서 날짜와 시간을 알아보기 쉬운 형태로 리턴하는 함수이다.

 

 

time.ctime

간단하게 현재시간만 리턴한다.

 

 

time.strftime

시간에 관계된 것을 세밀하게 표현하는 여러 가지 포맷 코드를 제공한다.


 

 

 

time.sleep

루프 안에서 많이 사용한다. 이 함수를 사용하면 일정한 시간 간격을 두고 루프를 실행할 수 있다.

 

정말로 1초의 시간 간격을 두고 다음이 출력되었다. 정말 신기했다.

 

 

 

 

인수 없이 time 함수 사용하기

입력 인수 없이 사용할 수 있다. 이럴 경우 현재 시각을 기준으로 함수가 수행된다.


 

 

 

3. math.gcd

최대공약수를 쉽게 구할 수 있다.

 

20은 최대공약수이고, 한 봉지당 얼마를 담아야 할 지도 구할 수 있다.


 

 

 

 

4. math.lcm

최소공배수를 구할 대 사용하는 함수이다.

 


 

 

 

5. random

난수(규칙이 없는 임의의 수)를 발생시키는 모듈이다. 먼저 random과 randint 함수에 대해서 알아보자. 다음은 0.0에서 1.0 사이의 난수 값을 리턴하는 예를 보여 준다.

 

 

random 모듈을 사용해서 재미있는 함수를 하나 만들어보자.

 

 

리스트 요소 중에서 무작위로 하나를 꺼내 다음 그 값을 리턴한다. 꺼낸 요소는 pop 메서드에 의해 사라진다. 리스트의 항목을 무작위로 섞고 싶을 때는 random.sample 함수를 사용하면 된다.

 


 

 

 

 

6. itertools.zip_longest

같은 개수의 자료형을 묶는 파이썬 내장 함수인 zip 함수와 똑같이 동작한다. 하지만 이 함 수는 전달한 반복 가능 핵체의 길이가 서로 다르다면, 긴 객체의 길에 맞춰 fillvalue에 설정한 값을 짧은 객체에 채울 수 있다.


 

 

 

students의 요소의 개수가 snacks보다 많을 때 그만큼을 '새우깡'으로 채우려면 어떠게 해야 할까? 요소의 개수가 많은 것을 기준으로 자료형을 묶는 itertools.zip_longest()를 사용하면된다. 부족한 항목은 None으로 채우는데, fillvalue로 값을 지정하면 None 대신 다른 값으로 채울 수 있다.

 


 

 

 

 

7. itertools.pernutation

반복 가능한 객체 중에서 r개를 선택한 순열을 이터레이터로 리턴하는 함수이다.

1, 2, 3이라는 숫자가 적힌 3장의 카드에서 2장의 카드를 꺼내 만들 수 있는 2자리 숫자를 모두 구하려면 어떻게 해야 할까? 

 

 

만들 수 있는 2자리 숫자는 다음과 같이 모두 6가지 이다.

 


 

 

 

조합을 사용하는 함수

3장의 카드에서 순서에 상관없이 2장을 고르는 조합은 itertools.combinations()를 사용하면 된다.


 

 

 

 

8. itertools.combination

반복 가능 객체 중에서 r개를 선택한 조합을 이터레이터로 리턴하는 함수이다. 1~45 중 서 로 다른 숫자 6개를 뽑는 로또 번호의 모든 경우의 수(조합)를 구하고 그 개수를 출력하려면 어떻게 해야 할까?

 

정말 끝도 없이 출력되고 있었다. 순환하여 출력하지 않고 이터레이터의 개수만 세려면 다음과 같이 하면  된다.

 


 

 

 

중복 조합을 사용하는 함수

만일 로또 복권이 숫자 중복을 허용하도록 규칙이 변경된다면 경우의 수는 몇 개나 될까? 같은 숫자를 허용하는 중복 조합은 itertools.combinations_with_replacement()를 사용하면 된다.


 

 

 

 

9. functools.reduce

함수를 반복 가능한 객체의 요소에 차례대로 누적 적용하여 이 객체를 하나의 값으로 줄이는 함수이다. 다음은 입력 인수 data의 요소를 모두 더하여 리턴하는 add 함수이다.

이 함수를 사용하여 코드를 줄여보기로 하자.

 

 

 

람다 함수를 data 요소에 차례대로 누적 적용하여 다음과 같이 계산한다. 

((((1 + 2) + 3) + 4) + 5)

 

 

 

 

10. operator.itemgetter

주로 sorted와 같은 함수의 key 매개변수에 적용하여 다양한 기준으로 정렬할 수 있도록 도와주는 모듈이다. 예를 들어 학생의 이름, 나이, 성적 등의 정보를 저장한 students 리스트가 있을 때 이를 나이순으로 정렬할 때 사용한다.

 

 

itemgetter(1)은 students의 아이템인 튜플의 두 번째 요소를 기준으로 정렬하겠다는 의미이다. 만약 itemgetter(2)와 같이 사용한다면 성적순으로 정렬한다. 이번에는 딕셔너리 형식으로 age를 기준으로 정렬해보자.

 

딕셔너리는 소괄호가 아니라 중괄호로 해야 한다.


 

 

 

operator.attrgetter()

리스트의 요소가 튜플이 아닌 Student 클래스의 객체라면 다음처럼 attrgetter()를 적용하여 정렬해야 한다.

 

 


 

 

 

학습을 마치고

표준 라이브러리는 지금 당장 사용하는 내용이 아니라 그냥 넘어가고 싶었지만 그래도 지금 아니면 언제 또 공부할까 싶어서 모두 정리하고 학습해보았다. 표준 라이브러리에서 사용하는 함수가 정말 많은데 앞부부의 절반만 정리했다. 뒷부분은 고급 기능이라서 어차피 잘 사용하지 않게 될거라 지금 공부해도 다 잊어버릴 것 같았다.