3 minute read

1. 시간 관련 라이브러리

1.1 datetime.date

datetime.date는 연,월,일로 날짜를 표현할 때 사용하는 함수이다. 기본적으로 아래와 같이 사용 가능하다.

1
2
3
>>> import datetime
>>> day1 = datetime.date(2024,08,08)
>>> dat2 = datetime.date(2023,08,09)

datetime.date를 사용하면 날짜간의 계산도 손쉽게 가능하다. 아래 예시를 보자.
day1에서 day2를 빼면 datetime 모듈의 timedelta 객체가 리턴된다. 이 객체를 diff 변수에 대입해서 찍어보면 계산된 날짜가 days에 반환되는 것을 알 수 있고 diff.days를 사용해 날짜간의 차이를 구할 수 있다.

1
2
3
4
5
>>> diff = day1 - day2
>>> diff
datetime.timedelta(days=365)
>>> diff.days
365


또 datetime을 사용하면 날짜의 요일도 쉽게 구할 수 있는데 weekday()를 사용한다. weekday()를 사용하면 날짜에 따라 0~6을 반환하게 되는데 0부터 순서대로 월요일이고 6은 일요일이 된다.

1
2
3
4
5
>>> day1.weekday()
3  ## 3 -> 수요일

>>> day2.weekday()
1  ## 1 -> 월요일



1.2 time

time 모듈에는 많은 함수들이 있지만 그 중 자주 쓰이는 2가지 정도만 알아보도록 하자.

1.2.1 time.strftime

strftime 함수는 시간에 관계된 것을 세밀하게 표현하는 여러가지 포맷코드를 제공한다. 기본 형식은 아래와 같다.
time()은 UTC(세계 표준시)를 사용해서 현재 시간을 실수로 리턴하고, localtime()은 time()이 리턴한 실수 값을 연,월,일,시,분,초,…의 형태로 바꿔준다.

1
time.strftime('출력할 형식 포맷 코드', time.localtime(time.time()))

포맷코드도 여러가지 종류가 있지만 자주 사용할 몇 가지만 알아보자.

포맷코드 설명
%a 요일의 줄임말 Mon
%A 요일 Monday
%b 달의 줄임말 Jan
%B January
%c 날짜와 시간을 출력 Tue Sep 10 15:34:26 2024
%d ‘10’
%H 24시 기준 시간 ‘15’
%I 12시 기준 시간 ‘03’
%m ‘09’
%M ‘34’
%S ‘26’
%x 현재 지역 기반 날짜 ‘09/10/24’
%X 현재 지역 기반 시간 ‘15:34:26’
%Y 연도 ‘2024’

위 포맷들을 사용해서 년도나 시간, 날짜 등을 얻을 수 있다.

1
2
3
4
5
6
7
8
9
>>> import time
>>> time.strftime('%c', time.localtime(time.time()))
'Tue Sep 10 15:35:37 2024'

>>> time.strftime('%B', time.localtime(time.time()))
'September

>>> time.strftime('%x', time.localtime(time.time()))
'09/10/24'



2. random

random은 다른 언어와 마찬가지로 규칙이 없는 임의의 수, 즉 난수를 발생시키는 모듈이다.

1
2
3
4
5
6
>>> import randaom
>>> random.random()
0.84195421

>>> random.randint(1, 55)>>>
'47'

2.1 random.choice()

choice 함수는 입력 받은 리스트에서 무작위로 하나를 선택해서 리턴한다.

1
2
3
>>> data = [1,2,3,4,5]
>>> random.choice(data)
4

2.2 random.sample

sample 함수는 입력 받은 리스트의 순서를 무작위로 섞어준다. 첫 번째 인자로는 섞을 리스트를 입력하고 두 번째 인자로는 무작위로 추출할 원소의 개수를 입력한다.

1
2
3
4
5
6
>>> data = [1,10,100,1000,10000]
>>> random.sample(data, 3)
[100,10,10000] 

>>> random.sample(data, 5)
[1,100,1000,10000,10]



3. itertools

itertools는 효율적으로 iterator(값을 차례대로 꺼낼 수 있는 객체)를 생성해주는 모듈이다. iterator를 사용하면 조합과 순열을 쉽게 구할 수 있다.

3.1 zip_longest()

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

1
2
3
4
5
6
7
>>> import itertools as itt
>>> name = ["apple","banana","carrot","durian"]
>>> fruit = ["사과","바나나","당근"]

>>> result = itt.zip_longest(name,fruit,fillvalue="X")
>>> print(list(result))
[('apple','사과'), ('banana','바나나'),('carrot','당근'),('durian','X')]

3.2 permutation()

반복 가능 객체 중에서 r개를 선택한 순열을 iterator로 반환한다.
예를 들어 1,2,3 세 개의 숫자 카드가 있다. 이 중 2개를 선택하는 경우의 수는 무엇일까? (1,2), (1,3), (2,3) 3가지 경우가 있고 순서를 거꾸로 한다면 총 6가지의 경우가 있다. 이 순열을 permutations() 함수를 사용하면 간단히 구할 수 있다.

1
2
3
>>> import itertools as itt
>>> list(itt.permutations([1,2,3], 2))
[(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]

그렇다면 세 개의 숫자 카드 중 2장을 뽑아 만들 수 있는 숫자를 구할 수 있을까? permutations() 함수를 응용하면 가능하다. 다양한 상황에 응용해 볼 수 있도록 하자.

1
2
3
4
5
6
7
8
9
>>> for a,b in itt.permutations(['1','2','3'],2):
...   print(a+b)
...
12
13
21
23
31
32

3.3 combiantions()

permutations()가 순서를 포함한 조합의 개수를 구하는 함수였다면 combinations() 함수는 순서에 상관없이 조합을 반환한다.

1
2
3
>>> import itertools as itt
>>> list(itt.combinations([1,2,3], 2))
[(1,2),(1,3),(2,3)]