Home [파이썬 프로그래밍 기초] 11강 - 모듈
Post
Cancel

[파이썬 프로그래밍 기초] 11강 - 모듈

💡해당 게시글은 방송통신대학교 정재화 교수님의 '파이썬 프로그래밍 기초' 강의를 개인 공부 목적으로 메모하였습니다.



학습 목표


  • 모듈, 패키지, 라이브러리를 구분할 수 있음
  • 모듈을 등록할 수 있음
  • 모듈의 메소드 및 변수를 사용할 수 있음



주요 용어


  • 모듈
    • 함수, 상수 또는 클래스를 모아 놓은 집합체
  • 네임 스페이스
    • 특정 객체를 이름에 따라 구분할 수 있는 범위
  • 난수
    • 특정한 배열 순서나 규칙적인 의미가 없는, 임의의 수를 의미



강의록


모듈의 이해

모듈의 역할

image.png

  • import 통해 남이 만든 좋은 코드를 그대로 가져다 사용 가능
  • 파이썬은 어떤 기능을 구현할 때 이미 만들어 놓은 도구들을 이용해 간편하게 작업할 수 있음

라이브러리와 프레임 워크

image.png

  • 라이브러리
    • 어떤 모듈과 패키지에 여러 가지의 조합들을 묶어서 어떠한 새로운 분야에 해당되는 일을 하려고 할 때 또는 기능을 구현 하려고 할 때 읽어 들이는 단위
  • 모듈(module)
    • 프로그래밍 과정에 극강의 효율성을 줄 수 있음
    • 라이브러리와 프레임 워크들을 구성하는 가장 작은 단위
    • 모듈은 하나의 파이썬 파일로 구성

모듈의 개념

  • 함수, 상수 또는 클래스를 모아 놓은 집합체

    image.png

    • 클래스
      • 다른 모듈의 확장
    • 함수
      • 특정 작업을 처리
    • 상수(변수)
      • 불변의 값

모듈, 패키지, 라이브러리

image.png

  • 모듈
    • 클래스, 함수, 상수의 집합
  • 패키지
    • 하위 패키지 및 모듈의 집합
  • 라이브러리
    • 패키지 및 모듈의 집합

모듈의 등록

  • 구문 형식 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)
    

네임 스페이스의 이해

  • 특정 객체를 이름에 따라 구분할 수 있는 범위

    image.png

    • 지역 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와 끼인 각 α인 삼각형의 넓이를 구하는 프로그램을 작성하시오.

    image.png

    • 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)
    • 특정한 배열 순서나 규칙적인 의미가 없는, 임의의 수를 의미
  • 난수 관련된 생성 기능을 제공하는 모듈
    • 특정 범위의 난수를 발생

    image.png

  • 난수 발생기
    • 번호들 사이에는 규칙이 없으나 프로그램을 실행할 때마다 동일한 값들이 도출되는 난수 발생
    • 시드를 통해 변형을 줌으로써 전체 나오는 패턴을 바꿔줄 수 있음
      • 같은 번호가 게속 나오면 시드를 바꾸어 주어야 함

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 모듈

  • 에포크 시간을 얻어 다양한 형식으로 표시하는 기능 제공

    image.png

    • 정수 부분은 초
    • 소수 점 부분은 밀리 세컨드
    • 시작 점은 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. 다음은 무엇에 대한 설명인가?

    1
    
     클래스, 함수, 상수(변수)의 집합
    

    a. 모듈

  2. 다음 중 모듈 사용과 관련된 명령어가 아닌 것은?

    a. module

  3. (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)



학습 정리


  • 모듈은 함수, 상수 또는 클래스를 모아 놓은 집합체임
  • 모듈, 패키지, 라이브러리는 구분되는 개념이며 패키지는 하위 패키지 및 모듈의 집합, 라이브러리는 패키지 및 모듈의 집합으로 구성되는 상위 개념임
  • 모듈 등록 시 import 구문과 from import 구문을 사용함
    • import 구문을 통해 등록된 모듈은 사용 시 모듈 이름 또는 별칭을 변수/함수/클래스 앞에 붙여야 함
  • import는 파이썬 모듈을 프로그램 내부에서 사용할 수 있게 네임 스페이스에 추가하는 기능을 수행함
  • dir 함수는 네임 스페이스에 등록되어 있는 모든 이름들을 리스트로 반환함
  • help 함수는 대화형 도움말 시스템 호출 또는 클래스나 메소드의 사용 방법을 반환함
  • 네임 스페이스는 특정 객체를 이름에 따라 구분할 수 있는 범위를 나타냄
  • del 명령어는 네임 스페이스 내 등록된 모듈의 멤버 식별자를 제거함
  • math 모듈은 수학적 계산 문제를 해결하기 위한 수학 함수 및 상수의 집합으로 구성됨
  • random은 난수 관련된 기능을 제공하는 모듈임
  • time은 에포크 시간을 얻어 다양한 형식으로 표시하는 기능 제공하는 모듈임

[파이썬 프로그래밍 기초] 10강 - 객체 지향

[파이썬 프로그래밍 기초] 12강 - 파일