| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- #abc 프로젝트 멘토링 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업 #공부일지 #멘토링일지
- #abc부트캠프 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업
- Today
- Total
나른한 코딩 생활
[5일차] ABC 부트캠프 Python 기초 4 & 미니 프로젝트 본문
오전에는 기초적인 함수 부분의 마무리를 하고
오후에는 미니 프로젝트를 해보는 것으로 장황했던 1주차 python 기초를 마무리 할 것이다.
Python 내장함수
Python 자체에는 내장되어 있는 함수가 여럿 존재하는데 그 중 일부만 알아보도록 하자
# enumerate
## enumerate는 ‘열거하다’라는 뜻이다. 이 함수는 순서가 있는 데이터(리스트, 튜플, 문자열)를 입력
## 받아 인덱스 값을 포함하는 enumerate 객체를 리턴
for i, name in enumerate(['Yong', 'Jung', 'Bu']):
print(i, name)
# 0 Yong
# 1 Jung
# 2 Bu
# id() 객체의 주소값을 반환한다
x = 10
id(x) # 164636264 # 해당 값은 컴파일 시점에 결정
#filter(func(), iterable)
## 해당 함수는 말 그대로 함수 fun()를 통해 iterable의 데이터를 걸러낸다
def filter_a(x):
return x % 2 == 0
for i in filter(filter_a,[1,2,3,4,5]):
print(i)
# 2
# 4
#zip
## zip(iterable) 함수는 동일한 개수로 이루어진 데이터들을 묶어서 반환함
list(zip([1, 2], [4, 5]))
#[(1, 3), (2, 4)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
list(zip("abc", "def"))
#[('a', 'd'), ('b', 'e'), ('c', 'f')]
Python 표준 라이브러리
Python을 사용하면 기본적으로 설치되어 있는 (pip) 함수들을 알아보자
해당 함수들은 import 과정을 통해 사용할 수 있다.
import datatime
# 날짜와 관련된 기능
import math
# 수학연산 관련 기능
import random
# 랜덤한 숫자 즉, 난수 설정
import glob
# 디렉토리 파일 리스트 조회
마지막으로 오늘 그리고 4일간의 기초 Python 교육의 총정리 형태로
파이썬 베이스볼 게임 만들기
미니 프로젝트를 진행해보았다.
먼저 베이스볼 게임의 룰과 제약사항 등은 다음과 같다
- 임의의 3자리 숫자 생성, ( 0~9 ) 까지의 서로 다른 숫자
- 사용자가 3자리 숫자 입력
- 숫자와 자리가 같으면 스트라이크 / 숫자만 맞고 자리가 틀리면 볼
- 결과로서 스트라이크와 볼의 개수를 사용자에게 알려준
- 숫자를 모두 맞추면 게임을 종료하고, 재시작 여부를 물음
먼저 나는 random 함수를 반복 비교 하여 3가지의 다른 숫자를 가진 str_ballnum 변수를 만들었다.
str_ballnum = '' # 랜덤 숫자를 저장할 새로운 빈 문자열 생성
# 숫자 생성 후 검토, 이상 없을 시 랜덤숫자 return
def BallNumber():
first_num = random.randint(0,9)
second_num = random.randint(0,9)
third_num = random.randint(0,9)
while first_num == second_num or second_num == third_num or first_num == third_num:
if(first_num == second_num):
second_num = random.randint(0,9)
if(second_num == third_num or first_num == third_num):
third_num = random.randint(0,9)
if(first_num != second_num and second_num != third_num and third_num != first_num):
str_ballnum = str(first_num) + str(second_num) + str(third_num)
return str_ballnum
해당 코드는 first_num 이라는 첫번째 숫자를 생성한다.
이후 해당 숫자를 second_num, third_num 으로 생성한 랜덤 숫자와 같다면 다시 설정한다
이후 first / second / third 숫자를 문자열로 결합하여 str_ballnum을 return 한다
다음으로는 조건에 맞는 숫자를 받기 위한 함 Judge_able(str_input, str_ballnum) 을 생성했다.
# 숫자 조건 판단후 CompareStringNum 실행
def Judge_able(str_input,str_ballnum):
global statement
global Contin
while statement != 5:
if len(str_input) == 3 and str_input[0] != str_input[1] and
str_input[1] != str_input[2] and str_input[2] != str_input[0]:
CompareStringNum(str_input,str_ballnum)
else :
print("조건대로 입력해주세요")
if statement != 5:
str_input = input("다음 숫자 : ")
else :
break
if (input("다시하려면 0을 누르세요")=='0'):
statement = 0
else :
Contin = False
먼저 statement 와 Contin 이라는 변수를 전역변수로 설정한다.
해당 변수들은 각각 게임의 종료 여부와 게임 재실행 여부를 결정하는 int / boolean 타입의 변수이다.
statement ==5 일 경우 한 게임이 끝났다(숫자를 맞춤)
Contin == False 일 경우 더 이상 추가게임을 하지 않겠다(main에서의 while문 종료)
이후 작성할 CompareStringNum 함수를 while 문 안에서 작동시켜 게임을 실행시킨다
그 전에 사용자가 입력한 숫자가 조건을 만족하지 않을 시
첫번째 else 문을 실행해 ComapreStringNum함수를 작동시키지 않는다
또한 게임을 새로 재시작을 원하면 '0'값을 입력받고
이 외의 경우에는 Contin 값을 False로 설정하여 게임을 완전 종료 시킨다
마지막으로 CompareStringNum(str_input, str_ballnum) 함수이다
# 숫자 비교 후 힌트 출력
def CompareStringNum(str_input,str_ballnum) :
int_strike = 0
int_ball = 0
global statement
# 전체 글자 비교 ( 홈런 or 아웃 )
if sorted(str_input) == sorted(str_ballnum): # ball + strike == 3
for i in range(0,3):
if str_ballnum[i] == str_input[i] :
int_strike +=1
# global로 설정 안할시, statement 값이 함수 외부에서 변하지 않는다
else :
int_ball += 1
if int_ball == 3 : # 3 ball
statement = 3
print("3ball")
elif int_strike == 3: # 3 strike = homerun
statement = 5
print("HomeRun! You win!")
elif int_ball == 1 and int_strike == 2 : # 1 ball 2 strike
statement = -2 # 불가능한 수
else : # 2 ball 1 strike
statement = -1
print("2ball 1strike")
else : # ball + strike != 3
for i in range(0,3):
if str_ballnum[i] == str_input[i]:
int_strike += 1
elif str_ballnum[i] != str_input[i] and
(str_ballnum[i] == str_input[i-1] or str_ballnum[i] == str_input[i-2]):
int_ball += 1
if int_ball == 1 and int_strike == 1 : # 1 ball 1 strike
statement = -3
print("1ball 1strike")
elif int_ball == 1 and int_strike == 0 : # 1 ball
statemnet = 1
print("1ball")
elif int_ball == 2 and int_strike == 0 : # 2 ball
statement = 2
print("2ball")
elif int_strike == 1 and int_ball == 0 : # 1 strike
statement = -4
print("1strike")
elif int_strike == 2 and int_ball == 0 : # 2 strike
statement = -5
print("2strike")
elif int_strike == 0 and int_ball == 0 : # out
statement = 3
print("Out!")
해당 코드문을 처음 작성할 당시 생각으로는 statement의 값을 match문에 할당해 print 함수를 실행할 예정이였으나,
statement 변수가 5(종료)일때를 제외하면 사용되어지지 않는 프로젝트이기에 statement 값이 0,5 이외에는 필요X
따라서 statement 는 삭제해도 상관 없어졌다
해당 식을 가동할 main문을 다음과 같이 작성했다
# main
Contin = True
while Contin:
ran_num = BallNumber()
# 확인용 랜덤 숫자
print(ran_num)
inputnum = input("중복된 숫자 없는 3자리 숫자를 입력하세요 : ")
Judge_able(inputnum,ran_num)
print('-----')
Contin 값이 True 일 경우 새로운 게임을 계속 재실행 할 수 있도록 설정하며,
Judge_able 함수에서 Contin 값이 False로 설정되면 이 코드는 마지막 print 문 시행 후 종료한다
다음은 코드의 완성본이다
# 완성본 // statement 변수는 사실상 필요없음
import random
str_ballnum = ''
statement = 0
# 1 ball = 1 / 2 ball = 2 / 3 ball = 3 / out = 4 / homerun = 5
# 2 ball 1 strike = -1 / 1 ball 2 strike = -2 불가능 / 1 ball 1 strike = -3
# 1 strike = -4 / 2 strike = -5 을 구분 짓는 변수
### 이후 과정에서 거의 필요 없어짐
# 숫자 생성 후 검토
def BallNumber():
first_num = random.randint(0,9)
second_num = random.randint(0,9)
third_num = random.randint(0,9)
while first_num == second_num or second_num == third_num or first_num == third_num:
if(first_num == second_num):
second_num = random.randint(0,9)
if(second_num == third_num or first_num == third_num):
third_num = random.randint(0,9)
if(first_num != second_num and second_num != third_num and third_num != first_num):
str_ballnum = str(first_num) + str(second_num) + str(third_num)
return str_ballnum
# 숫자 조건 판단후 CompareStringNum 실행
def Judge_able(str_input,str_ballnum):
global statement
global Contin
while statement != 5:
if len(str_input) == 3 and str_input[0] != str_input[1] and str_input[1] != str_input[2] and str_input[2] != str_input[0]:
CompareStringNum(str_input,str_ballnum)
else :
print("조건대로 입력해주세요")
if statement != 5:
str_input = input("다음 숫자 : ")
else :
break
if (input("다시하려면 0을 누르세요")=='0'):
statement = 0
else :
Contin = False
# 숫자 비교 후 힌트 출력
def CompareStringNum(str_input,str_ballnum) :
int_strike = 0
int_ball = 0
global statement
# 전체 글자 비교 ( 홈런 or 아웃 )
if sorted(str_input) == sorted(str_ballnum): # ball + strike == 3
for i in range(0,3):
if str_ballnum[i] == str_input[i] :
int_strike +=1
else :
int_ball += 1
if int_ball == 3 : # 3 ball
print("3ball")
elif int_strike == 3: # 3 strike = homerun
print("HomeRun! You win!")
elif int_ball == 1 and int_strike == 2 : # 1 ball 2 strike
statement = -2 # 불가능한 수
else : # 2 ball 1 strike
print("2ball 1strike")
else : # ball + strike != 3
for i in range(0,3):
if str_ballnum[i] == str_input[i]:
int_strike += 1
elif str_ballnum[i] != str_input[i] and (str_ballnum[i] == str_input[i-1] or str_ballnum[i] == str_input[i-2]):
int_ball += 1
if int_ball == 1 and int_strike == 1 : # 1 ball 1 strike
print("1ball 1strike")
elif int_ball == 1 and int_strike == 0 : # 1 ball
print("1ball")
elif int_ball == 2 and int_strike == 0 : # 2 ball
print("2ball")
elif int_strike == 1 and int_ball == 0 : # 1 strike
print("1strike")
elif int_strike == 2 and int_ball == 0 : # 2 strike
print("2strike")
elif int_strike == 0 and int_ball == 0 : # out
print("Out!")
# main
Contin = True
while Contin:
ran_num = BallNumber()
# 확인용 랜덤 숫자
print(ran_num)
inputnum = input("중복된 숫자 없는 3자리 숫자를 입력하세요 : ")
Judge_able(inputnum,ran_num)
print('-----')
이렇게 장황했던 ABC 부트캠프의 1주차가 끝이 났다.
python은 이미 한 두번 기초를 경험해 보았으나 아직도 부족하다고 느끼는 점이 많다
미니 프로젝트 도중에도 모르거나 헷갈리는 부분이 있었으니...
기반을 다지는 것은 중요하다
다음주에도 Python 프로그래밍을 공부하겠지만 새로운 강사님과 함께
더욱 심화된 내용을 공부하게 될 것이다
오늘의 포스트는 여기서 끝내겠다!
'ABC 부트캠프' 카테고리의 다른 글
| [7일차] ABC 부트캠프 공공데이터 활용 및 Pandas 라이브러리 (0) | 2024.07.03 |
|---|---|
| [6일차] ABC 부트캠프 데이터 시각화 (0) | 2024.07.01 |
| [4일차] ABC 부트캠프 Python 기초 3 (0) | 2024.06.27 |
| [3일차] ABC 부트캠프 PYTHON 기초 2 (0) | 2024.06.26 |
| [2일차] ABC 부트캠프 PYTHON 기초 (0) | 2024.06.25 |