yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

~2023.02/Python

프로그래밍 기초 in Python _ [토픽4] 파이썬 응용하기 _ 파이썬 모듈 맛보기 & 사용자 입력 받기

2021. 9. 17. 00:45
모듈
<calculator.py>

# 더하기
def add(x, y):
    return x + y

# 빼기
def subtract(x, y):
    return x - y

# 곱하기
def multiply(x, y):
    return x * y

# 나누기
def divide(x, y):
    return x / y

이 함수들을 활용해서 프로그램을 만들려고 한다. 그러면 코드 맨 밑으로 가서, 이 함수들을 사용하면 된다.

그런데 이렇게 한 파일에 함수도 다 정의하고, 우리가 실제 실행하려는 코드도 다 쓰다 보면 하나의 파일이 너무 길어질 수도 있다. 그래서 코드를 여러 파일로 분리해서 사용하기도 한다.

<run.py>

import calculator

이것은 calculator라는 파이썬 파일을 불러와서 사용하겠다는 의미이다.

이때 calculator.py파일을 '모듈'이라고 한다. 다른 파이썬 프로그램에서 사용할 수 있는 파이썬 코드를 '모듈'이라고 하는 것이다.

여기서 주의해야 할 점이 하나 있다. 현재 이 run.py파일이랑 같은 폴더에 있는 파이썬 파일만 불러올 수 있다는 것이다.

지금 같은 경우에는 run.py랑 우리가 불러오려는 calculator.py랑 같은 폴더에 있기 때문에 이렇게 불러올 수 있는 것이다.

다른 폴더에 있는 모듈도 사실 불러올 수 있긴 하지만 이번 토픽에서는 다루지 않도록 하겠다.


아무튼 그러면 이제 calculator 파일에 있는 함수들을 사용할 수 있다.

import calculator

print(calculator.add(2,5))
print(calculator.multiply(3, 4))
7
12

import calculator as calc

print(calc.add(2, 5))
print(calc.multiply(3, 4))

모듈명이 길 경우 이렇게 마음대로 줄여서 사용할 수도 있다.


from calculator import add, multiply

print(add(2, 5))
print(multiply(3, 4))

이것은 calculator라는 모듈에서 add함수와 multiply함수만 불러오겠다는 의미이다. 그러면 이 프로그램에서 add함수와 multiply함수를 쓸 수 있는 것인데, 이제는 앞에 붙어 있는 이 모듈 이름을 쓸 필요가 없다.

마치 이 파일 내에서 정의한 함수인 것처럼 사용할 수 있는 것이다.

from calculator import *

하나씩 불러오는 게 귀찮으면 한꺼번에 불러올 수 있는데, 함수들 대신 별표(*)를 쓰면 된다.

그러나 이 방식을 사용하면 함수들의 출처가 좀 불분명해지므로 파이썬 커뮤니티에서도 권장하지 않는 방법이다.

 

스탠다드 라이브러리
import math

print(math.log10(100))
print(math.cos(0))
print(math.pi)
2.0
1.0
3.141592653589793

import random

pritn(random.random())  # 0.0과 1.0 사이의 랜덤한 수가 리턴됨

import os

print(os.getlogin())  # 현재 컴퓨터에 어떤 계정으로 로그인 되어 있는지 알 수 있음
print(os.getcwd())  # 현재 이 파일이 있는 폴더의 경로를 받아 옴

os는 operating system, 한국말로는 '운영체제'의 약자이다. 이 os 모듈은 파이썬으로 우리의 운영체제를 조작하기 위한 것이다.

 

random 모듈
import random

스탠다드 라이브러리에 있는 random 모듈은 랜덤한 숫자를 생성하기 위한 다양한 함수들을 제공해 줍니다.

 

randint 함수

randint는 두 수 사이의 어떤 랜덤한 정수를 리턴하는 함수입니다.

randint(a, b)를 하면, a ≤ N ≤ b를 만족하는 어떤 랜덤한 정수 N을 리턴하는 것이죠.

import random

print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
8
3
6
6
2

1 이상, 20 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?

 

uniform 함수

uniform은 두 수 사이의 랜덤한 소수를 리턴하는 함수입니다. randint와 다른 것은 리턴하는 값이 정수가 아니라 소수라는 점입니다.

uniform(a, b)를 하면, a ≤ N ≤ b를 만족하는 어떤 랜덤한 소수 N을 리턴하는 것이죠.

import random

print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
0.08811632754196952
0.599056286966887
0.03005761564442677
0.45302183459579204
0.5120418463594933

0 이상, 1 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?

 

datetime 모듈
import datetime

스탠다드 라이브러리에 있는 datetime 모듈은 '날짜'와 '시간'을 다루기 위한 다양한 '클래스'를 갖추고 있습니다. '클래스' 개념은 아직 배우지 않았지만, 일단은 몰라도 이 모듈을 사용하는 데에는 문제 없습니다.

 

datetime 값 생성

2020년 3월 14일을 파이썬으로 어떻게 표현할 수 있을까요? 이렇게 하면 됩니다.

pi_day = datetime.datetime(2020, 3, 14)
print(pi_day)
print(type(pi_day))
2020-03-14 00:00:00
<class 'datetime.datetime'>

보시다시피 시간은 자동으로 00시 00분 00초로 설정되었는데요. 우리가 시간까지도 직접 정할 수 있습니다.

pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(pi_day)
print(type(pi_day))
2020-03-14 13:06:15
<class 'datetime.datetime'>

 

오늘날짜

우리가 날짜와 시간을 정해 주는 게 아니라, 코드를 실행한 '지금 이 순간'의 날짜와 시간을 받아 오고 싶다면? 이렇게 하면 됩니다.

today = datetime.datetime.now()
print(today)
print(type(today))
2020-04-05 17:49:12.360266
<class 'datetime.datetime'>

 

timedelta

두 datetime 값 사이의 기간을 알고 싶으면, 마치 숫자 뺄셈을 하듯이 그냥 빼면 됩니다.

today = datetime.datetime.now()
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(today - pi_day)
print(type(today - pi_day))
22 days, 4:42:57.360266
<class 'datetime.timedelta'>

보시다시피 두 datetime 값을 빼면, timedelta라는 타입이 나오는데요. 이건 날짜 간의 차이를 나타내는 타입이라고 생각하시면 됩니다.

반대로 timedelta를 생성해서 datetime 값에 더해 줄 수도 있습니다.

today = datetime.datetime.now()
my_timedelta = datetime.timedelta(days=5, hours=3, minutes=10, seconds=50)

print(today)
print(today + my_timedelta)
2020-04-05 17:54:24.221660
2020-04-10 21:05:14.221660

 

datetime 해부하기

datetime 값에서 '연도'나 '월' 같은 값들을 추출하려면 어떻게 해야 할까요?

아주 간단합니다!

today = datetime.datetime.now()

print(today)
print(today.year)  # 연도
print(today.month)  # 월
print(today.day)  # 일
print(today.hour)  # 시
print(today.minute)  # 분
print(today.second)  # 초
print(today.microsecond)  # 마이크로초
2020-04-05 17:59:21.709817
2020
4
5
17
59
21
709817

 

datetime 포맷팅

datetime 값을 출력하면 별로 예쁘지 않습니다. 하지만 strftime을 사용하면, 우리 입맛대로 바꿀 수 있습니다.

today = datetime.datetime.now()

print(today)
print(today.strftime("%A, %B %dth %Y"))
2020-04-05 18:09:55.233501
Sunday, April 05th 2020

%A, %B, %d, %Y와 같은 걸 포맷 코드라고 하는데요. 어떤 포맷 코드를 사용할지는 아래 표를 참고해 주세요.

포맷 코드설명 예시
%a 요일 (짧은 버전) Mon
%A 요일 (풀 버전) Monday
%w 요일 (숫자 버전, 0~6, 0이 일요일) 5
%d 일 (01~31) 23
%b 월 (짧은 버전) Nov
%B 월 (풀 버전) November
%m 월 (숫자 버전, 01~12) 10
%y 연도 (짧은 버전) 16
%Y 연도 (풀 버전) 2016
%H 시간 (00~23) 14
%I 시간 (00~12) 10
%p AM/PM AM
%M 분 (00~59) 34
%S 초 (00~59) 12
%f 마이크로초 (000000~999999) 413215
%Z 표준시간대 PST
%j 1년 중 며칠째인지 (001~366) 162
%U 1년 중 몇 주째인지 (00~53, 일요일이 한 주의 시작이라고 가정) 35
%W 1년 중 몇 주째인지 (00~53, 월요일이 한 주의 시작이라고 가정) 35

 

input
name = input("이름을 입력하세요: ")
print(name)
이름을 입력하세요: Codeit
Codeit

우리가 Codeit을 입력하고 엔터를 치면, 이 input함수의 리턴값으로 문자열 Codeit이 돌아오게 된다.

그러니까 input("이름을 입력하세요: ") 이 부분이 문자열 Codeit으로 대체된다. 그러면 문자열 Codeit이 변수 name에 저장되고 그래서 print(name)을 하니까 Codeit이 출력되는 것이다.


x = input("숫자를 입력하세요: ")
print(x + 5)

input 함수가 받는 사용자 입력은 항상 문자열이다. 그래서 문자열과 정수를 더하려고 하면 오류가 나온다.

즉 이것을 해결하기 위해서는 input의 리턴값을 정수형으로 변환해야 한다.

x = int(input("숫자를 입력하세요: "))
print(x + 5)
숫자를 입력하세요: 7
12

 

실습과제: 숫자 맞히기 게임

1과 20 사이의 숫자를 맞히는 게임을 만들려고 합니다. random 모듈과 input 함수를 활용하여 프로그램을 만들어 보세요.

진행 방식

  1. 프로그램을 실행하면 "기회가 *번 남았습니다. 1-20 사이의 숫자를 맞혀 보세요: "가 출력됩니다. 총 네 번의 기회가 주어지며, 사용자가 한 번 추측할 때마다 남은 기회 횟수가 줄어듭니다.
  2. 정답을 맞히면 "축하합니다. *번 만에 숫자를 맞히셨습니다."가 출력되고 프로그램은 종료됩니다.
  3. 사용자가 입력한 수가 정답보다 작은 경우 "Up"이 출력되고, 입력한 수가 정답보다 큰 경우 "Down"이 출력됩니다.
  4. 정답이 틀렸으면 1번부터 다시 진행합니다. 만약 네 번의 기회를 모두 사용했는데도 답을 맞히지 못했으면, "아쉽습니다. 정답은 *입니다."가 출력되고 프로그램은 종료됩니다.

시뮬레이션 #1

기회가 4번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 10
Up
기회가 3번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 15
Up
기회가 2번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 17
축하합니다. 3번만에 숫자를 맞히셨습니다.

시뮬레이션 #2

기회가 4번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 19
Down
기회가 3번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 14
Down
기회가 2번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 6
Up
기회가 1번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 10
UP
아쉽습니다. 정답은 12였습니다.

 

'~2023.02 > Python' 카테고리의 다른 글

프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 사전 & 파이썬 데이터의 비밀  (0) 2021.09.05
프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 리스트 & for 반복문  (0) 2021.09.04
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 제어문  (0) 2021.09.03
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 추상화  (0) 2021.09.03
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 자료형  (0) 2021.09.03
    '~2023.02/Python' 카테고리의 다른 글
    • 프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 사전 & 파이썬 데이터의 비밀
    • 프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 리스트 & for 반복문
    • 프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 제어문
    • 프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 추상화
    yooniiverse
    yooniiverse

    티스토리툴바