학습 목표
- 모듈, 패키지, 라이브러리를 구분할 수 있음
- 모듈을 등록할 수 있음
- 모듈의 메소드 및 변수를 사용할 수 있음
주요 용어
- 모듈
- 함수, 상수 또는 클래스를 모아 놓은 집합체
- 네임 스페이스
- 특정 객체를 이름에 따라 구분할 수 있는 범위
- 난수
- 특정한 배열 순서나 규칙적인 의미가 없는, 임의의 수를 의미
강의록
모듈의 이해
모듈의 역할
import
통해 남이 만든 좋은 코드를 그대로 가져다 사용 가능- 파이썬은 어떤 기능을 구현할 때 이미 만들어 놓은 도구들을 이용해 간편하게 작업할 수 있음
라이브러리와 프레임 워크
- 라이브러리
- 어떤 모듈과 패키지에 여러 가지의 조합들을 묶어서 어떠한 새로운 분야에 해당되는 일을 하려고 할 때 또는 기능을 구현 하려고 할 때 읽어 들이는 단위
- 모듈(module)
- 프로그래밍 과정에 극강의 효율성을 줄 수 있음
- 라이브러리와 프레임 워크들을 구성하는 가장 작은 단위
- 모듈은 하나의 파이썬 파일로 구성
모듈의 개념
함수, 상수 또는 클래스를 모아 놓은 집합체
- 클래스
- 다른 모듈의 확장
- 함수
- 특정 작업을 처리
- 상수(변수)
- 불변의 값
- 클래스
모듈, 패키지, 라이브러리
- 모듈
- 클래스, 함수, 상수의 집합
- 패키지
- 하위 패키지 및 모듈의 집합
- 라이브러리
- 패키지 및 모듈의 집합
모듈의 등록
구문 형식 1
1
import 모듈이름 [as 별칭]
- 파이썬 모듈을 프로그램 내부에서 사용할 수 있게 네임 스페이스에 추가하는 명령어
모듈이름 / 별칭․변수
모듈이름 / 별칭.함수()
모듈이름 / 별칭.클래스
- 파이썬 모듈을 프로그램 내부에서 사용할 수 있게 네임 스페이스에 추가하는 명령어
구문 형식 2
1
from 모듈이름 import 메소드1, [메소드2/함수/클래스…]
1
from 모듈이름 import *
- 모듈 이름 없이 변수, 함수, 클래스를 사용
변수
함수()
클래스
- 모듈 이름 없이 변수, 함수, 클래스를 사용
모듈의 등록 확인
1
2
3
4
5
import math
dir() # 어떤 모듈들이 등록(import) 되어 있는지 확인할 수 있는 dir 함수
dir(math) # math 모듈에 어떤 멤버들이 있는지 확인
help(math.gamma) # 등록 된 함수의 사용 방법을 알고자 할 때 사용
- dir 함수
- 네임 스페이스에 등록되어 있는 모든 이름들을 리스트로 반환
1
dir()
1
dir(math)
- help 함수
- 대화형 도움말 시스템 호출 또는 클래스나 메소드의 사용 방법 반환
1
help(math.abs)
1
help("python".upper)
네임 스페이스의 이해
특정 객체를 이름에 따라 구분할 수 있는 범위
- 지역 NS
- 함수 또는 메소드 내의 이름 공간
- 전역 NS
- 모듈 전체에서 통용되는 이름 공간
- 빌트인 NS
- 모든 코드 범위
- 지역 NS
모듈의 제거
구문 형식
1
del 등록된_모듈이름
- 네임 스페이스 내 모듈의 멤버 식별자 제거
- 네임 스페이스에 올라온 여러 식별자들이 겹칠 수 있음
- 새 모듈의 함수, 변수 등의 이름이 겹치는 이유로 이전 모듈을 제거해야 할 때에는
del
사용- 간혹 오류 발생 시 해당 모듈을 네임 스페이스에서 제거
원뿔 계산 프로그램 개선
math 모듈을 활용한 원뿔 계산
1 2 3 4 5 6 7 8 9 10 11 12
# 원뿔 클래스 정의 class Cone : def __init__(self, radius = 20, height = 30): self.r = radius self.h = height def get_vol(self) : return 1 / 3 * 3.14 * self.r ** 2 * self.h def get_surf(self) : return 3.14 * self.r ** 2 + 3.14 * self.r * self.h
math 모듈을 사용함으로써 수학적으로 정교한 수치를 얻을 수 있음
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import math print(math.pi) # 원뿔 클래스 정의 class Cone : def __init__(self, radius = 20, height = 30): self.r = radius self.h = height def get_vol(self) : return 1 / 3 * math.pi * self.r ** 2 * self.h # 3.14 보다 정확한 파이 값 사용 def get_surf(self) : return math.pi * self.r ** 2 + math.pi * self.r * self.h
유용한 모듈
math 모듈
- 수학적 계산 문제를 해결하기 위한 수학 함수 및 상수의 집합
- C 언어 표준에 정의된 수학적 계산 함수를 내장
- π, e와 같은 상수 제공
1
math.gcd(6, 8)
1
math.factorial(5)
1
math.e
1
dir(math)
math 모듈 멤버
멤버 | 설명 |
---|---|
pi | 원주율 |
e | 자연 로그 e |
fabs(x) | x의 절대 값 |
ceil(x) | x의 가장 가까운 정수로 올림 |
floor(x) | x의 가장 가까운 정수로 버림 |
exp(x) | x의 지수 함수(e^x) 값 |
log(x) | x의 자연 로그 값 |
sqrt(x) | x의 제곱근 |
sin(x) | x의 사인 값 |
asin(x) | sin의 역 함수에 대한 라디안 각도 |
cos(x) | x의 코사인 값 |
tan(x) | x의 탄젠트 값 |
degrees(x) | 라디안 각도 x를 도 단위로 변환 |
삼각형 넓이 계산 프로그램
두 변의 길이 a, b와 끼인 각 α인 삼각형의 넓이를 구하는 프로그램을 작성하시오.
math 모듈 활용하여 삼각형 넓이 구하기
1 2 3 4 5 6 7 8 9 10
import math a, b = 10, 20 # area = 1 / 2 * a * b * math.sin(60) # 결과 값이 음수가 나옴 파이 값으로 매개 변수 추가해야 함 # 60도를 호도법으로 바꾸어야 함 area = 1 / 2 * a * b * math.sin(math.radians(60)) # 60도를 호도법으로 바꾼 값의 sin 값 산출 print(area)
특정 함수 몇 가지만 부분적으로 호출하게 되면 해당 함수는 모듈 명을 쓰지 않고 직접 사용 가능
1 2 3 4 5 6 7 8 9 10 11
import math from math import sin a, b = 10, 20 # area = 1 / 2 * a * b * math.sin(60) # 결과 값이 음수가 나옴 파이 값으로 매개 변수 추가해야 함 # 60도를 호도법으로 바꾸어야 함 area = 1 / 2 * a * b * sin(math.radians(60)) # 60도를 호도법으로 바꾼 값의 sin 값 산출 print(area)
random 모듈
- 난수(random number)
- 특정한 배열 순서나 규칙적인 의미가 없는, 임의의 수를 의미
- 난수 관련된 생성 기능을 제공하는 모듈
- 특정 범위의 난수를 발생
- 난수 발생기
- 번호들 사이에는 규칙이 없으나 프로그램을 실행할 때마다 동일한 값들이 도출되는 난수 발생
- 시드를 통해 변형을 줌으로써 전체 나오는 패턴을 바꿔줄 수 있음
- 같은 번호가 게속 나오면 시드를 바꾸어 주어야 함
random 모듈 멤버
멤버 | 설명 |
---|---|
random() | 0~1 사이의 숫자 중 난수 발생 |
randint(a, b) | a부터 b 사이의 숫자 중 난수 발생 |
randrange(a, b, c) | a부터 b 사이의 c의 간격으로 나열된 숫자 중 난수 발생 |
choice(sequence) | 주어진 항목을 랜덤하게 반환 |
sample(sequence) | 랜덤하게 여러 개의 원소를 선택 |
shuffle(sequence) | 시퀀스의 순서를 랜덤하게 섞음 |
가위-바위-보 게임
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random # random 모듈 import
options = ["가위", "바위", "보"]
user = input("가위,바위,보를 입력: ")
com = random.choice(options) # option 리스트를 랜덤하게 반환
if user == com:
print("비겼다!")
elif user == "바위" and com == "가위":
print("이겼다!")
elif user == "보" and com == "바위":
print("이겼다!")
elif user == "가위" and com == "보":
print("이겼다!")
else:
print("졌다!")
로또 추첨 프로그램
1 ~ 45 숫자 6개를 입력 받아 당첨 숫자와 비교하는 프로그램을 작성하시오.
1 2 3 4
숫자를 입력하세요: 42, 1, 6, 22, 30, 31 당첨 숫자는 1, 2, 45, 21, 22, 39 입니다. 2개가 맞았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
import random # random 모듈 import # 사용자의 입력 값 그대로 사용할 수 없음 -> input을 통해 들어온 긴 문자열을 콤마 기준으로 분리 guess_str = input("1 ~ 45 번호 6개를 쉼표로 분리하여 입력하세요 : ").split(", ") guess_list = list() # 숫자로 된 문자열을 하나씩 읽어 int형으로 받은 뒤 guess_list 에 저장 for i in guess_str: guess_list.append(int(i)) # guess_str의 값들을 하나하나 정수로 변환하여 guess_list에 하나씩 추가 lotto_list = random.sample(range(1, 46, 1), 6) # 1부터 45까지의 값 중 6개의 값을 랜덤으로 추출 print("예상 번호는", guess_list, "입니다.") print("추첨 번호는", lotto_list, "입니다.") hit_count = 0 for guess in guess_list: if guess in lotto_list: # 비교 연산자 in hit_count = hit_count + 1 print("축하합니다 " + str(hit_count) + "개 맞혔습니다.")
.split(", ")
- 분할 기준 되는 문자를 매개 변수로 대입
- 콤마와 스페이스 기준으로 분리
스무 고개 프로그램
20번의 기회 안에 1 ~ 1000 사이의 숫자를 맞히는 스무 고개 프로그램을 작성하시오.
1 2 3
숫자를 맞혀보세요(1번째 시도): 52 52보다 큽니다. 숫자를 맞혀보세요(2번째 시도): 69 69보다 작습니다. 숫자를 맞혀보세요(3번째 시도): …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import random hit_number = random.randint(1, 1001) # 정수를 무작위로 추출 guess_count_list = range(1, 21, 1) # 1 ~ 20 까지 들어있는 리스트 생성하여 현재 몇 번째 시도인지를 출력 passfail = False # 실패했다고 가정 for guess_count in guess_count_list: # 20번 반복하는 for문 guess = int(input("숫자를 맞혀 보세요(" + str(guess_count)+"번째 시도): ")) # 반복할 때마다 몇번 째 시도인지 알려줘야 함 if hit_number == guess: passfail = True # 숫자를 20회 내에 맞힌 경우에는 반복할 필요 없음 break # 반복 중단할 때 사용 elif hit_number > guess: print(str(guess) + "보다 큽니다.", end = "") else: print(str(guess) + "보다 작습니다.", end = "") if passfail == True: print("맞혔습니다. 축하합니다.") else: print("모든 기회를 다 사용하셨습니다. 다음에 다시 도전하세요")
time 모듈
에포크 시간을 얻어 다양한 형식으로 표시하는 기능 제공
- 정수 부분은 초
- 소수 점 부분은 밀리 세컨드
- 시작 점은 1970년도 01월 01일
time 모듈 멤버
멤버 | 설명 |
---|---|
time() | 1970.1.1 자정 이후로 누적된 초를 실수 단위로 반환 |
gmtime() | struct_time 형식으로 기준 시각 변환 |
localtime(time) | 입력된 초를 변환하여, 지방 표준 시 기준 시각으로 변환 |
strftime(str, time) | 지정된 형식으로 시각을 변환 |
ctime() | 현재 시간을 반환 |
sleep(n) | 현재 동작 중인 프로세스를 주어진 n초만큼 멈춤 |
소수 찾기 프로그램
1 ~ 1000 사이에 소수(prime number)를 찾고 실행 시간을 출력하는 프로그램을 작성하시오.
1 2 3 4
시작 시각은 Fri Apr 7 00:46:21 2023 입니다. 소수는 2, 3, 5, 7, 11, 13 종료 시각은 Fri Apr 7 00:46:58 2023 입니다. 총 37초 실행했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
import time start_time = time.time() # 1970.1.1 이후로 경과 된 시점을 초 단위로 환산 # 소수인지 판별하는 함수 def is_prime(x): for i in range(2, x): # 2부터 x-1까지 반복 if x % i == 0: return False # i로 나누었을 때 나누어 떨어지면(나머지가 0이면) 소수가 아니므로 False 반환 return True prime_count = 0 for i in range(1, 5001): # 1부터 5000까지 확인 if is_prime(i): prime_count = prime_count + 1 print(i, end = ", ") end_time = time.time() print("\n", end_time - start_time, "초 실행했습니다.")
연습 문제
다음은 무엇에 대한 설명인가?
1
클래스, 함수, 상수(변수)의 집합
a. 모듈
다음 중 모듈 사용과 관련된 명령어가 아닌 것은?
a. module
(a)에서 option 리스트의 값 중 하나가 무작위로 선택되어 com에 할당하도록 빈 칸 □에 들어갈 알맞은 코드는?
- (a) 가위 바위-보-프로그램
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import random options = ["가위", "바위", "보"] user = input("가위, 바위, 보를 입력: ") com = random.choice(options) if user == com: print("비겼다!") elif user == "바위" and com == "가위": print("이겼다!") elif user == "보" and com == "바위": print("이겼다!") elif user == "가위" and com == "보": print("이겼다!") else: print("졌다!")
a.
random.choice(options)
- (a) 가위 바위-보-프로그램
학습 정리
- 모듈은 함수, 상수 또는 클래스를 모아 놓은 집합체임
- 모듈, 패키지, 라이브러리는 구분되는 개념이며 패키지는 하위 패키지 및 모듈의 집합, 라이브러리는 패키지 및 모듈의 집합으로 구성되는 상위 개념임
- 모듈 등록 시 import 구문과 from import 구문을 사용함
- import 구문을 통해 등록된 모듈은 사용 시 모듈 이름 또는 별칭을 변수/함수/클래스 앞에 붙여야 함
- import는 파이썬 모듈을 프로그램 내부에서 사용할 수 있게 네임 스페이스에 추가하는 기능을 수행함
- dir 함수는 네임 스페이스에 등록되어 있는 모든 이름들을 리스트로 반환함
- help 함수는 대화형 도움말 시스템 호출 또는 클래스나 메소드의 사용 방법을 반환함
- 네임 스페이스는 특정 객체를 이름에 따라 구분할 수 있는 범위를 나타냄
- del 명령어는 네임 스페이스 내 등록된 모듈의 멤버 식별자를 제거함
- math 모듈은 수학적 계산 문제를 해결하기 위한 수학 함수 및 상수의 집합으로 구성됨
- random은 난수 관련된 기능을 제공하는 모듈임
- time은 에포크 시간을 얻어 다양한 형식으로 표시하는 기능 제공하는 모듈임