으뜸 파이썬 7장 - 모듈과 활용

DH Park·2024년 6월 28일
0
post-thumbnail

https://book.naver.com/bookdb/book_detail.nhn?bid=16268369

으뜸 파이썬과 함께 공부하는 포스트입니다.


모듈은 파이썬 함수나 변수 또는 클래스들을 모아놓은 스크립트 파일이다.

파이썬은 여러 기관과 개발자들에 의해 만들어진 많은 모듈이 있고, 이 모듈을 이용하여 효과적으로 소프트웨어를 개발할 수 있다. 개발된 모듈은 표준 라이브러리 라는 이름으로 파이썬 설치파일과 함께 제공된다.

미리 만들어진 모듈을 쓸 때 import와 함께 모듈 이름을 써 주고, 사용할 때에는 모듈 이름에 점을 찍고 모듈 안의 구성요소를 호출해주면 된다.

       import 모듈이름1 [, 모듈이름2, ....]

표준 라이브러리는 문자열과 텍스트 처리를 위한 모듈, 이진 데이터 처리, 날짜, 시간, 배열 등의 자료형 처리를 위한 모듈, 수치 연산과 수학 함수 모듈, 파일과 디렉터리 접근, 유닉스 시스템의 데이터베이스 접근을 위한 모듈, 데이터 압축, 그래픽 모듈 등 100가지 이상이 있다.


날짜와 시간 모듈 datetime

날짜와 시간에 관련된 datetime 모듈은 가장 기초적인 것 중 하나인데, 날짜와 시간에 관한 기능을 제공, 조작할 수 있도록 한다. 앞에서 언급했듯이 사용할 때에는 import datetime 과 같은 식으로 입력한다.


datetime 모듈을 사용하기 위해 datetime 모듈을 import로 먼저 가져오고, 클래스를 가져온다.

이 모듈 내에는 모듈 이름과 같은 클래스가 날짜와 시간에 관한 기능을 제공한다. 클래스에 접근하려면 마침표를 사용하여 datetime.datetime과 같이 쓴다. 앞은 모듈, 뒤는 클래스이다.

위 코드는 현재 날짜와 시간을 구하는 것이다. 클래스 뒤의 now() 메소드는 년,월,일,시,분,초,밀리초 단위 까지 나타낸다. 클래스와 마찬가지로 메소드를 호출할 때에도 마침표를 이용한다.

다음은 datetime모듈 date클래스의 today()를 사용해보자.

today는 보다시피 년, 월, 일까지 나타낸다. today.year, today.month, today.day는 연도와 월과 일을 따로따로 보고 싶을 때 사용한다. 이런 속성을 확인하기 위해 맨 위의 코드같은 것을 변수에 할당하는 것을 잊지 말자.

파이썬은 dir() 함수를제공하는데, 이 함수는 모듈이 가진 클래스의 목록을 출력해준다.

이렇게 많이 있다. 설명을 하자면 maxyear은 datetime 오브젝트가 표현 가능한 최대 년도, 즉 9999이고 minyear은 1이다. 그 외 날짜, 시간, 시간대, 시간대 정보 등을 편리하게 이용할 수 있다.

날짜나 시간 값을 변경하고자 하면 replace() 메소드를 이용하면 된다.

코드를 살펴보자면 현재 시간을 변수에 할당하고, replace 메소드 내부에 월을 12월로, 일을 25일로 바꾸는 모습이다. 앞으로도 이런 실습을 많이 할 것이다.

그런데, 위와 같이 datetime.datetime.now()로 일일이 적자고 하면 코드를 적는 것이 번거롭기 때문에 as 구문을 이용하여 모듈 이름 datetime을 별칭인 dt로 간단히 할 수 있다.

       import [모듈 이름] as [모듈의 별칭]

여기서 as 구문은 모듈 이름을 모듈의 별칭으로 사용하겠다고 선언하는 것이다.

이런 as 구문을 쓸 때 자주 쓰는 별칭을 알아보자.
datetime은 dt, random은 rd, math는 m, turtle은 t로 자주 사용한다.

이제 from ~ import ~ 구문을 알아보자. 이는 [모듈이름].[클래스 이름].메소드 이름 방식의 호출을 간단하게 하는 방법이다. from 모듈이름 import 클래스이름이나 from 모듈이름 import 함수이름 과 같은 방식으로 불러오면 위에서 사용한 [모듈이름].[클래스 이름].메소드 이름을 [클래스 이름].메소드 이름으로 축약할 수 있다.



LAB 7-1 오늘의 날짜와 현재 시간 출력하기

  1. datetime 모듈을 사용하여 오늘 날짜와 시간을 다음과 같이 출력하여라. 이 때 hour값이 10일 경우 오전 10시, 13이면 오후 1시와 같이 오전/오후 정보를 출력하여라.

실행 결과

년, 월 ,일은 앞에서 배운대로 쓰면 되고, 시, 분, 초는 hour, minute, second를 사용하면 된다.

그리고 컴퓨터 시계는 24시간제를 채택하므로 오후 1시는 13시이다. 그러므로 시간이 12보다 큰 수가 나오면 오후, 작은 수가 나오면 오전을 표시하는 if문을 사용하였다.

  1. 남은 시간 구하기
    오늘부터 올해 크리스마스까지 남은 시간이 얼마인지 구해보자.

실행 결과

today에 오늘 날짜 값을 할당하고, print()문에 year, month, day 값을 입력하여 날짜를 출력해준다.

그리고 다음 크리스마스의 날짜를 xMas 변수에 2020 12 25를 넣는다. 그 후 xMas에서 today를 빼주면 크리스마스와 오늘 날짜 사이의 차이 값을 얻을 수 있다. 이 차이 값은 timedelta 클래스형으로 저장되며 이 클래스의 days와 seconds 속성을 이용하여 날 수와 초를 얻을 수 있다. //3600은 초를 시간으로 변환하기 위한 것이다.


time 모듈

시간에 관련된 정보를 제공하므로 datetime과 유사한 점이 많다. 서버용 시스템의 운영체제로 많이 사용되는 유닉스 시스템은 매우 특이한 시간 체계를 가진다.

1970년 1월 1일 0시0분 0초 협정 세계시(UTC)를 시작시간으로 지금까지의 경과한 시간을 100만분의 1초 단위로 기록하고 저장하는 체계를 가진다. 이 시작시간을 에폭이라하며, 에폭 이후 경과 시간을 저장하고 출력할 수 있고, 이를 여러가지 형식으로 출력도 가능하다.

이 시간 체계를 에폭 시간 혹은 유닉스 시간이라 한다. 이제 time 모듈의 사용법을 알아보자.

위 대화창 결과와 같이 나온다. 1608430251.0478187은 에폭 이후의 시간을 초 단위로 표시한 값이다. 소숫점 아래 최소 단위는 100만분의 1초로 매우 정밀한 시간을 반환한다.

시간에 해당하는 초를 맞는 값에 나눔으로서 그리니치 천문대를 기준으로 표시되는 유닉스 시간을 자신이 사는 곳을 기준으로 하는 현재시간으로 바꿀 수 있다.

이제 time.time()으로 현재 시간을 출력해보자.

실행 결과

strftime() 함수는 localtime() 함수가 반환한 struct_time 이라는 형식의 튜플 값을 지정된 포맷의 문자열로 변환시키는 기능을 한다. 여기서 %Y는 연도, %m은 달 %d는 날을 지시하는 형식지정자이다. datetime과 유사한 기능이다.

또, sleep() 함수는 일정 시간동안 현재 실행중인 쓰레드를 일시중지시키는 역할을 한다. 쓰레드란 한 프로그램 안에서 실행되는 작은 실행단위이다. 아래에서는 다음 코드가 실행될 때까지 프로세스를 붙잡아 두는 역할을 하므로 시스템은 아무것도 하지 않고 4.5초를 보낸다.

실행 결과


수학 관련 모듈 math

다음은 math 모듈이다. 이 모듈의 내부에는 원주율, 자연상수 e 값 등이 정의되어있다. 다른 수학에 관련된 함수도 매우 많이 포함되어 있다. 앞에서 본 dir()이라는 함수로 내장함수를 보자.

몇개를 실습해보자.

하나씩 보자면, pow()는 3의 3 제곱을 의미한다. fabs는 실수 절대값이다. ceil은 올림값을 표현했다.

floor는 내림값이다. log는 말 그대로 로그인데, log(100, 10)은 10을 밑으로 하는 100값이므로 2가 나온다.

이제 삼각함수 sin() 함수를 사용해보자. sin()에 90도를 넣으면 1이 되어야하는데 다른 값이 나온다. 왜 그럴까?

1에 가까운 값이 나온다. 정확하게는 나오지 않는데, 이유는 원주율 3.14159는 정확한 값이 아니라 근사치이기 때문이다.

원주율은 m.pi를 통해 출력해볼수 있고, m.radians(90)을 하면 90도의 라디안 값을 출력한다. 이 값은 90 * pi/180값이다.

이제 sin의 역함수를 구해보자. 명령어는 sin()이 아닌 asin()을 쓴다.
그 밖에도 tan()값도 구할 수 있다. 이것도 마찬가지로 정확한 값이 나오지 않는다.
수치 오류를 유발할 수 있음을 명심하자.

LAB 7-4 math 모듈을 이용한 계산

  1. math 모듈과 for - in range()를 사용하여 4의 2승부터 10승까지를 출력해라.

실행 결과

  1. 일반각도 0도에서 180도를 10도 단위로 출력해라. 라디안 값도 같이 출력해라.

실행 결과


랜덤 모듈 random

랜덤 모듈은 임의의 수를 생성하거나 리스트 내의 요소를 무작위로 섞거나 선택하는 함수를 포함한다.

대표적인 함수를 몇가지 알아보자.


이를 코드로 실습해보자.

보다시피 random() 함수는 매번 다른 실수를 반환한다.

이제 나머지도 해보자.

shuffle 함수도 매번 다른 순서로 시퀀스를 섞어 반환한다. choice는 인자 중 하나를 고르는 것이고, sample은 개수를 정해서 무작위로 인자를 반환하는 함수이다.


의사 랜덤과 시드 번호

프로그래밍 언어에서 사용하는 랜덤함수는 의사 랜덤 생성기를 이용한다.

의사란 의심스러운, 유사한 등의 뜻이 있다. 진정한 의미의 랜덤이 아닌 랜덤과 유사한 기능이라는 뜻이다.

이것을 이용하여 난수를 만들어보자.

profile
Web Deveolper / Offensive Security Consultant (Prev)

0개의 댓글