본문 바로가기
ABC부트캠프

[6일차] ABC 부트캠프 : 파이썬프로그래밍4 (24.07.11)

by 나무거나 2024. 7. 12.
728x90

 

ABC부트캠프 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업 #인공지능 #파이썬 #머신러닝 #딥러닝​

기술배움 4일차!! 오늘은 파이썬 기초의 마지막 날입니다.

오늘은 파이썬의 라이브러리와 프로젝트를 진행하였는데요!

 

간단한 프로젝트이지만 꽤 어렵더라구요

블로그 마지막에 설명을 남겨 두었으니 참고해서 풀어보시는걸 추천드립니다.​

오늘도 화이팅!!

 


라이브러리란?

프로그래밍에서 라이브러리란, 특정 기능을 수행하기 위해 미리 작성된 코드의 모음입니다. 개발자들이 자주 사용하는 기능을 손쉽게 구현할 수 있도록 도와줍니다. 예를 들어, 날짜와 시간을 다루거나 수학적 계산을 할 때, 혹은 파일 시스템에서 특정 파일을 찾을 때 사용할 수 있는 도구들을 제공합니다.

출처 입력

datetime.date

datetime.date는 파이썬에서 날짜를 나타내기 위해 사용하는 클래스입니다. 이 클래스를 사용하면 연도, 월, 일 정보를 쉽게 다룰 수 있습니다.

import datetime
day1 = datetime.date(2021, 12, 14)  # 2021년 12월 14일을 나타냄
day2 = datetime.date(2023, 4, 5)    # 2023년 4월 5일을 나타냄
diff = day2 - day1  # 두 날짜 사이의 차이를 계산
print(diff.days)    # 일(day) 단위로 차이를 출력
>>>477
 
  • datetime.date(연도, 월, 일) 형식으로 특정 날짜를 지정할 수 있습니다.
  • day2 - day1은 두 날짜의 차이를 계산하며, 결과는 datetime.timedelta 객체입니다.
  • diff.days는 두 날짜 사이의 일(day) 수를 반환합니다.

 

예제 하나 보여드릴께요!

회사에서 프로젝트 일정을 관리할 때, 시작 날짜와 마감 날짜를 기준으로 일정의 남은 일수를 계산해야 한다고 해 보자구요!

import datetime

# 프로젝트 시작일과 마감일
start_date = datetime.date(2023, 7, 1)
end_date = datetime.date(2023, 12, 31)

# 오늘 날짜
today = datetime.date.today()

# 마감일까지 남은 일수 계산
days_left = end_date - today
print(f"프로젝트 마감일까지 {days_left.days}일 남았습니다.")
 

위 코드를 설명하자면

  • import datetime: datetime 모듈을 임포트하여 날짜와 시간을 다룰 수 있는 기능을 사용합니다.
  • start_date = datetime.date(2023, 7, 1): 프로젝트 시작일을 2023년 7월 1일로 설정합니다.
  • end_date = datetime.date(2023, 12, 31): 프로젝트 마감일을 2023년 12월 31일로 설정합니다.
  • today = datetime.date.today(): 오늘 날짜를 가져옵니다.
  • days_left = end_date - today: 마감일까지 남은 일수를 계산합니다. 결과는 datetime.timedelta 객체입니다.
  • days_left.days: 남은 일수를 일(day) 단위로 출력합니다.

 

간단하죠? 이 내용은 제가 사용해본건 날짜데이터를 전처리 하기 위해 사용했던 모듈이었어요.

시간대, 날짜별로 분류하거나 주중, 주말을 분리하는 등의 데이터 전처리에 사용했던 기억이 있네요.

 

math - 수학 연산 관련 기능

math.gcd

math.gcd는 최대 공약수(gcd, greatest common divisor)를 계산하는 함수입니다. 최대 공약수는 두 수의 공통된 약수 중에서 가장 큰 수를 의미합니다.

import math
result = math.gcd(60, 100, 80)  # 60, 100, 80의 최대 공약수를 계산
print(result)                   
>>>20
 
  • math.gcd(a, b, ...) 형식으로 여러 수의 최대 공약수를 구할 수 있습니다.
  • 이 함수는 주어진 숫자들의 공통된 약수 중 가장 큰 값을 반환합니다.

 

math.lcm

math.lcm는 최소 공배수(lcm, least common multiple)를 계산하는 함수입니다. 최소 공배수는 두 수의 공통된 배수 중에서 가장 작은 수를 의미합니다.

import math
result = math.lcm(15, 25)  # 15와 25의 최소 공배수를 계산
print(result)              
>>> 75
 

 

random - 난수 생성

random.random

random.random은 0.0과 1.0 사이의 임의의 실수를 반환하는 함수입니다. 이 함수는 시뮬레이션이나 임의의 값을 생성할 때 유용합니다.

import random
result = random.random()  # 0.0 이상 1.0 미만의 임의의 실수를 생성
print(result)
 

random.randint

random.randint는 지정된 범위 내에서 임의의 정수를 반환하는 함수입니다. 예를 들어, 1과 10 사이의 임의의 정수를 생성할 수 있습니다..

import random
result = random.randint(1, 10)  # 1 이상 10 이하의 임의의 정수를 생성
print(result)
 
  • random.randint(a, b)는 a 이상 b 이하의 임의의 정수를 반환합니다.
  • 이 함수는 주사위 굴리기, 랜덤 추첨 등 다양한 상황에서 사용됩니다.

 

사용 예: 경품 추첨

온라인 쇼핑몰에서 경품 추첨을 할 때 임의로 당첨자를 선택해야 한다고 합시다.

import random

# 1부터 100까지의 숫자 중에서 임의의 숫자를 선택해 당첨자 선정
winner = random.randint(1, 100)
print(f"이번 경품 추첨의 당첨자는 번호 {winner}입니다.")
 

설명:

  1. import random: random 모듈을 임포트하여 난수를 생성합니다.
  2. winner = random.randint(1, 100): 1 이상 100 이하의 임의의 정수를 생성합니다.
  3. print(f"이번 경품 추첨의 당첨자는 번호 {winner}입니다."): 생성된 임의의 정수를 출력합니다.

 

 

glob - 디렉토리 파일 리스트 조회

glob.glob

glob.glob는 특정 패턴에 맞는 파일 경로를 찾는 함수입니다. 이 함수는 파일 시스템에서 특정 확장자나 이름 패턴을 가진 파일을 찾을 때 유용합니다.

import glob
result = glob.glob("./*.ipynb")  # 현재 디렉토리에서 .ipynb 확장자를 가진 모든 파일을 찾음
print(result)
 
  • glob.glob(pattern) 형식으로 패턴에 맞는 파일 경로를 리스트로 반환합니다.
  • 예를 들어, "./*.ipynb"는 현재 디렉토리에서 .ipynb 확장자를 가진 모든 파일을 찾습니다.
  • 이 함수는 파일 정리나 특정 파일 검색에 유용합니다.

 

사용 예: 특정 파일 형식 찾기

컴퓨터에서 특정 형식의 파일(.ipynb)을 모두 찾아 리스트로 출력하고 싶을 때 사용합니다.

import glob

# 현재 디렉토리에서 .ipynb 파일을 모두 찾음
notebook_files = glob.glob("./*.ipynb")
print("현재 디렉토리에 있는 Jupyter 노트북 파일 목록:")
for file in notebook_files:
    print(file)
 

라이브러리 사용의 장점

시간 절약: 이미 작성된 코드를 재사용할 수 있어 개발 시간을 단축합니다.

코드 간결화: 복잡한 기능을 간단하게 구현할 수 있습니다.

신뢰성: 검증된 코드이기 때문에 오류 발생 가능성이 줄어듭니다.

유지보수 용이: 라이브러리를 업데이트함으로써 새로운 기능이나 버그 수정을 쉽게 적용할 수 있습니다.

출처 입력


중요한 점심시간

오늘도 맛나게 먹었습니다.


이제 저희의 오늘의 목표이자 파이썬 기초의 마지막 프로젝트인

야구게임을 만들어 보겠습니다.

 

군대에서 선후임이랑 많이 했던기억이 있는 게임인데요

 

자 이제 시작해 보겠습니다.

파이썬 베이스볼 게임 만들기
이 연습문제는 숫자 맞추기 게임인 베이스볼 게임을 파이썬으로 구현하는 것을 목표로 합니다.
베이스볼 게임은 사용자가 컴퓨터가 생성한 임의의 숫자를 맞추는 게임으로, 맞춘 숫자와 위치에 따라 스트라이크와 볼의 개수를 알려줍니다.

주요 기능
임의의 숫자 생성: 컴퓨터가 0-9 사이의 서로 다른 3개의 숫자를 임의로 생성합니다.
사용자 입력: 사용자가 3자리 숫자를 입력합니다.
스트라이크 및 볼 계산: 사용자가 입력한 숫자와 위치를 비교하여 스트라이크와 볼의 개수를 계산합니다.
결과 출력: 스트라이크와 볼의 개수를 사용자에게 알려줍니다.
게임 종료: 사용자가 숫자를 모두 맞추면 게임을 종료하고, 재시작 여부를 묻습니다.

세부 기능 설명
임의의 숫자 생성: random 모듈을 사용하여 0-9 사이의 서로 다른 3개의 숫자를 임의로 생성합니다.
사용자 입력: 사용자가 3자리 숫자를 입력할 수 있도록 하고, 입력값이 유효한지 검사합니다. (숫자, 길이, 중복 체크)

스트라이크 및 볼 계산
스트라이크: 숫자와 위치가 모두 맞는 경우
볼: 숫자는 맞지만 위치가 다른 경우
예: 컴퓨터 숫자가 123이고, 사용자가 135를 입력한 경우, 1 스트라이크 1 볼
결과 출력: 스트라이크와 볼의 개수를 출력합니다. 예: "1 스트라이크, 1 볼"
게임 종료: 사용자가 모든 숫자를 맞추면 게임을 종료하고, 재시작 여부를 묻습니다. 예: "3 스트라이크! 정답입니다! 게임을 다시 시작하시겠습니까? (Y/N)"

 

출처 입력

import random
random.random()

while True:
    pc = []  # pc가 선정한 숫자 (중복 확인 포함)
    while len(pc) < 3:  # 중복되지 않는 3개의 숫자 생성
        ran_num = random.randint(0, 9)
        if ran_num not in pc:
            pc.append(ran_num)
    while True:
        user_input = input("3자리 숫자를 입력하세요: ")
        if len(user_input) != 3 or not user_input.isdigit():  # 유효한 3자리 숫자 검사
            print("유효한 3자리 숫자를 입력하세요.")
            continue
        user_list = list(map(int, user_input))
        if len(set(user_list)) != 3:  # 중복되지 않는 숫자 검사
            print("중복되지 않는 3자리 숫자를 입력하세요.")
            continue
        
        strike = 0
        ball = 0
        for i in range(3):
            if pc[i] == user_list[i]:
                strike += 1
            elif pc[i] in user_list:
                ball += 1
        if strike == 3:
            restart = input("3 스트라이크! 정답입니다! 게임을 다시 시작하시겠습니까? (Y/N): ").strip().upper()
            if restart == 'Y':
                break
            else:
                print("게임을 종료합니다.")
                exit()
        else:
            print("{}스트라이크 {}볼".format(strike, ball))
 

세부 기능 설명

 

1. 임의의 숫자 생성

while True:
    pc = []  # pc가 선정한 숫자 (중복 확인 포함)
    while len(pc) < 3:  # 중복되지 않는 3개의 숫자 생성
        ran_num = random.randint(0, 9)
        if ran_num not in pc:
            pc.append(ran_num)
 
  • pc = []는 컴퓨터가 선택한 숫자를 저장할 리스트를 초기화합니다.
  • while len(pc) < 3:는 pc 리스트의 길이가 3이 될 때까지 반복합니다.
  • ran_num = random.randint(0, 9)는 0부터 9까지의 숫자 중 하나를 랜덤으로 생성합니다.
  • if ran_num not in pc:는 ran_num이 이미 pc 리스트에 있는지 확인합니다. 중복되지 않는 경우에만 pc 리스트에 추가합니다.
  • 이 과정을 통해 중복되지 않는 3개의 숫자를 생성합니다.
  • print(pc)는 디버깅 용도로 컴퓨터가 선택한 숫자를 출력합니다. 실제 게임에서는 이 부분을 제거해야 합니다.

 

2. 사용자 입력 받기 및 유효성 검사

while True:
    user_input = input("3자리 숫자를 입력하세요: ")
    if len(user_input) != 3 or not user_input.isdigit():  # 유효한 3자리 숫자 검사
        print("유효한 3자리 숫자를 입력하세요.")
        continue
    user_list = list(map(int, user_input))
    if len(set(user_list)) != 3:  # 중복되지 않는 숫자 검사
        print("중복되지 않는 3자리 숫자를 입력하세요.")
        continue
 
  • user_input = input("3자리 숫자를 입력하세요: ")는 사용자가 입력한 3자리 숫자를 문자열로 받습니다.
  • if len(user_input) != 3 or not user_input.isdigit():는 입력된 문자열의 길이가 3이 아니거나 숫자가 아닌 경우를 검사합니다. 유효하지 않은 입력이면 오류 메시지를 출력하고 다음 입력을 받기 위해 계속합니다.
  • user_list = list(map(int, user_input))는 입력된 문자열을 정수 리스트로 변환합니다.
  • if len(set(user_list)) != 3:는 변환된 리스트에 중복된 숫자가 있는지 검사합니다. 중복된 숫자가 있으면 오류 메시지를 출력하고 다음 입력을 받기 위해 계속합니다.

 

3. 스트라이크와 볼 계산 및 결과 출력

strike = 0
ball = 0
for i in range(3):
    if pc[i] == user_list[i]:
        strike += 1
    elif pc[i] in user_list:
        ball += 1
if strike == 3:
    restart = input("3 스트라이크! 정답입니다! 게임을 다시 시작하시겠습니까? (Y/N): ").strip().upper()
    if restart == 'Y':
        break
    else:
        print("게임을 종료합니다.")
        exit()
else:
    print("{}스트라이크 {}볼".format(strike, ball))
 
  • strike = 0와 ball = 0은 스트라이크와 볼의 개수를 저장할 변수를 초기화합니다.
  • for i in range(3):는 3자리 숫자를 하나씩 비교하기 위한 반복문입니다.
  • if pc[i] == user_list[i]:는 컴퓨터의 숫자와 사용자의 숫자가 같은 위치에 있는지 확인하고, 같으면 strike를 1 증가시킵니다.
  • elif pc[i] in user_list:는 컴퓨터의 숫자가 사용자 입력에 포함되어 있지만 위치가 다른 경우를 확인하고, 이 경우 ball을 1 증가시킵니다.
  • if strike == 3:는 3 스트라이크인 경우를 확인합니다.
  • 사용자가 숫자를 모두 맞췄다면 재시작 여부를 묻고, 'Y'를 입력하면 게임을 재시작합니다.
  • 'N'을 입력하면 게임을 종료합니다.
  • else:는 3 스트라이크가 아닌 경우 스트라이크와 볼의 개수를 출력합니다.

파이썬 기초는 이것을 마지막으로 과정이 끝났습니다.

이후부터는 데이터 분석에 사용가능한 판다스를 배우고 정리해서 올리도록 하겠습니다!

 

 

 

728x90