제로베이스데이터스쿨_230411_스터디리뷰노트_05_047~

김지태·2023년 4월 12일
0
post-thumbnail

로또 머신 모듈 만들기 연습 1

import random

우선 리스트가 세 개 필요하다

하나는 사용자, 내가 뽑는 번호들이 있는 곳,

둘 째는 기계가 뽑는 번호들이 있는 곳,

마지막으로 기계와 내가 뽑은 번호들 중 일치하는 번호들이 있는 곳.

userNums = [] ; randNums = [] ; collNums = []

randBonusNum = 0

강사님이 getter 와 setter 가 필요하다 하는데 정확히 각각 기능이 뭐지? / 게터는 세팅된 값을 가져오는 것? / 세터는 입력한 값들을 세팅하는 것? / 세터는 입력한 값을 함수에 넣엊준다고 생각하고, 게터는 함수 박스 안에 있는 것을 밖으로 꺼내는 것이라 생각하자.

그리고 게터와 세터는 userNums, randNums 각각에 하나씩 필요하다. collNums에는 필요 없다

def setUserNums(ns): # 사용자가 매개변수인 번호를 입력하면 userNums에 넣도록 한다.
global userNums
userNums = ns # 이게 입력한 값을 리스트에 넣는것, 그런데 그냥 '=' 으로 해도 userNums가 애초에 리스트니까 계속 값이 쌓이는 건가?

def getUserNums(): # 사용자가 입력한 것을 빼온다
return userNums

def setRandNums():
global randNums
randNums = random.sample((1, 46), 6)

def getRandNums():
return randNums

def setBonusNum():
global randBonusNum

while True:
randBonusNum = random.randint(1, 45)
if randBonusNum not in randNums:
break

def getBonusNum():
return randBonusNum

def lottoResult():
global userNums
global randNums
global randBonusNum

collNums = []
for un in userNums:
if un in randNums:
collNums.append(un)

if len(collNums) == 6:
print('1등 당첨')
print(f'번호 : {collNums}')

elif (len(collNums)) == 5 and (randBonusNum in userNums):
print('2등 당첨')
print(f'번호: {collNums}, 보너스 번호: {randBonusNum}')

elif len(collNums) == 5:
print(f'3등 당첨')
print(f'번호: {collNums}')

elif len(collNums) == 4:
print(f'4등 당첨')
print(f'번호: {collNums}')

elif len(collNums) == 3:
print(f'5등 당첨')
print(f'번호: {collNums}')

else:
print('꽝! 다음 기회에.')
print(f'기계번호: {randNums}')
print(f'Bonus 번호: {randBonusNum}')
print(f'user 번호: {userNums}')
print(f'correct 번호: {collNums}')

def startLotto():
n1 = int(input('번호 (1 ~ 45) 입력: '))
n2 = int(input('번호 (1 ~ 45) 입력: '))
n3 = int(input('번호 (1 ~ 45) 입력: '))
n4 = int(input('번호 (1 ~ 45) 입력: '))
n5 = int(input('번호 (1 ~ 45) 입력: '))
n6 = int(input('번호 (1 ~ 45) 입력: '))
selectNums = [n1, n2, n3, n4, n5, n6]

setUserNums(selectNums)
setRandNums()
setBonusNum()

lottoResult()

로또 머신 모듈 만들기 연습 2

import random

userNums = [] ; randNums = [] ; collNums = []

randBonusNum = 0

def getUserNums():
return userNums
def setUserNums(ns):
global userNums
userNums = ns

def getRandNums():
return randNums
def setRandNums():
global randNums
randNums = random.sample(range(1, 46), 6)

def getBonusNum():
return randBonusNum
def setBonusNum():
global randBonusNum

while True:
randBonusNum = random.randint(1, 45)
if randBonusNum not in randNums:
break

def lottoResult():
global userNums
global randNums
global collNums

collNums = []

for un in userNums:
if un in randNums:
collNums.append(un)

if len(collNums) == 6:
print('1등 당첨')
print(f'번호 : {collNums}')

elif (len(collNums)) == 5 and (randBonusNum in userNums):
print('2등 당첨')
print(f'번호: {collNums}, 보너스 번호: {randBonusNum}')

elif len(collNums) == 5:
print(f'3등 당첨')
print(f'번호: {collNums}')

elif len(collNums) == 4:
print(f'4등 당첨')
print(f'번호: {collNums}')

elif len(collNums) == 3:
print(f'5등 당첨')
print(f'번호: {collNums}')

else:
print('꽝! 다음 기회에.')
print(f'기계번호: {randNums}')
print(f'Bonus 번호: {randBonusNum}')
print(f'user 번호: {userNums}')
print(f'correct 번호: {collNums}')

#### 로또 머신 모듈 만들기 연습 3

import random

userNums = [] ; randNums = [] ; collNums = []

randBonusNum = 0

def setUserNums(ns):
global userNums
userNums = ns

def getUserNums():
return userNums

def setRandNums():
global randNums
randNums = random.sample(range(1, 46), 6)

def getRandNums():
return randNums

def setBonusNum():
global randBonusNum

while True:
randBonusNum = random.randint(1, 45)
if randBonusNum not in randNums:
break

def getBonusNum():
return randBonusNum

def lottoResult(): # 로또 결과 - 얼마나 일치하는지 봐야됨
global userNums
global randNums
global randBonusNum

collNums = []
for un in userNums:
if un in randNums:
collNums.append(un)

if len(collNums) == 6:
print('1등 당첨')
if len(collNums) == 5 and randBonusNum in userNums:
print('2등 당첨')
if len(collNums) == 5:
print('3등 당첨')
if len(collNums) == 4:
print('4등 당첨')
if len(collNums) == 3:
print('5등 당첨')

else:
print('꽝! 다음 기회에.')
print(f'기계번호: {randNums}')
print(f'Bonus 번호: {randBonusNum}')
print(f'user 번호: {userNums}')
print(f'correct 번호: {collNums}')

def startLotto(): # 로또 시작 - 숫자 입력하게 해야됨
n1 = int(input('번호 (1 ~ 45) 입력: '))
n2 = int(input('번호 (1 ~ 45) 입력: '))
n3 = int(input('번호 (1 ~ 45) 입력: '))
n4 = int(input('번호 (1 ~ 45) 입력: '))
n5 = int(input('번호 (1 ~ 45) 입력: '))
n6 = int(input('번호 (1 ~ 45) 입력: '))
selectNums = [n1, n2,n3,n4,n5,n6]

setUserNums(selectNums)
setRandNums()
setBonusNum()

lottoResult()

로또 머신 모듈 만들기 연습 4

import random

뽑은숫자 = [] ; 로또넘버 = [] ; 맞힌숫자 = []

보너스넘버 = []

def 로또시작하기():
n1 = int(input('번호 (1 ~ 45) 입력: '))
n2 = int(input('번호 (1 ~ 45) 입력: '))
n3 = int(input('번호 (1 ~ 45) 입력: '))
n4 = int(input('번호 (1 ~ 45) 입력: '))
n5 = int(input('번호 (1 ~ 45) 입력: '))
n6 = int(input('번호 (1 ~ 45) 입력: '))
뽑은숫자리스트 = [n1, n2,n3,n4,n5,n6]

뽑은숫자리스트에넣기(뽑은숫자리스트)
로또넘버리스트에넣기()
보너스넘버정하기()

로또결과()

def 뽑은숫자리스트에넣기(ns):
global 뽑은숫자
뽑은숫자 = ns

def 로또넘버리스트에넣기():
global 로또넘버
로또넘버 = random.sample(range(1, 46), 6)

def 보너스넘버정하기(): # wrong
global 보너스넘버

while True:
보너스넘버 = random.randint(1, 45)
if 보너스넘버 not in 로또넘버:
break

def 뽑은숫자리스트완성():
return 뽑은숫자

def 로또넘버리스트완성():
return 로또넘버

def 보너스넘버완성():
return 보너스넘버

def 로또결과():

global 뽑은숫자
global 로또넘버
global 맞힌숫자

맞힌숫자 = []

for 당첨번호 in 뽑은숫자:
if 당첨번호 in 로또넘버:
맞힌숫자.append(당첨번호)

if len(당첨번호) == 6:
print(f'1등 당첨 \n번호: {당첨번호}')

elif len(당첨번호 == 5) and 보너스넘버 in 당첨번호: # if-elif 구조는 앞의 조건이 참이면 뒤의 조건문은 더 이상 실행하지 않고, if-if 구조는 참, 거짓 여부와 관계없이 항상 실행하게 된다.
print('2등 당첨')
print(f'번호: {collNums}, 보너스 번호: {randBonusNum}')

elif len(collNums) == 5:
print(f'3등 당첨')
print(f'번호: {collNums}')

elif len(collNums) == 4:
print(f'4등 당첨')
print(f'번호: {collNums}')

elif len(collNums) == 3:
print(f'5등 당첨')
print(f'번호: {collNums}')

else:
print('꽝! 다음 기회에.')
print(f'기계번호: {randNums}')
print(f'Bonus 번호: {randBonusNum}')
print(f'user 번호: {userNums}')
print(f'correct 번호: {collNums}')

이렇게 변수 이름을 내 마음대로 정해가며 코드를 만드는 것도 좋은 학습 방법인 것 같다. 당연히 변수 이름은 나중에 일을 할 때는 영어로 하는 것이 맞겠으나, 연습의 단계에서 변수 이름을 한글로 적으면 함수와 함수가 어떻게 맞물려가는지 더 쉽게 알 수 있는 것 같다.

마지막으로 로또머신 한 번만 더 연습하고 진도를 나가보자.

로또 머신 모듈 만들기 연습 5

import random

내번호 = []
로또번호 = []
맞힌번호 = []

보너스번호 = 0

def 로또시작():
n1 = int(input('번호 (1 ~ 45) 입력: '))
n2 = int(input('번호 (1 ~ 45) 입력: '))
n3 = int(input('번호 (1 ~ 45) 입력: '))
n4 = int(input('번호 (1 ~ 45) 입력: '))
n5 = int(input('번호 (1 ~ 45) 입력: '))
n6 = int(input('번호 (1 ~ 45) 입력: '))
뽑은숫자리스트 = [n1, n2, n3, n4, n5, n6]

내번호리스트에넣기(뽑은숫자리스트)
로또번호리스트에넣기()
보너스번호정하기()

로또결과()

def 내번호리스트에넣기(n):
global 내번호
내번호 = n

def 내번호반환하기():
return 내번호

def 로또번호리스트에넣기():
global 로또번호
로또번호 = random.sample(range(1, 46), 6)

def 로또번호반환하기():

근데 왜 반환해야하는거지?

return 로또번호

def 보너스번호정하기():
global 보너스번호

while True:

보너스번호 = random.randint(1, 45)
if 보너스번호 not in 로또번호:
  break

def 보너스번호반환하기():
return 보너스번호

def 로또결과():
global 내번호
global 로또번호
global 맞힌번호

맞힌번호 = []

for 번호 in 내번호:
if 번호 in 로또번호:
맞힌번호.append(번호)

if len(맞힌번호) == 6:
print(f'1등 당첨, 내 번호: {내번호}, 로또번호 :{로또번호}')

elif len(맞힌번호) == 5 and 내번호 in 보너스번호:
print(f'2등 당첨, 내 번호: {내번호}, 로또번호 :{로또번호}')
elif len(맞힌번호) == 5:
print(f'3등 당첨, 내 번호: {내번호}, 로또번호 :{로또번호}')
elif len(맞힌번호) == 4:
print(f'4등 당첨, 내 번호: {내번호}, 로또번호 :{로또번호}')
elif len(맞힌번호) == 3:
print(f'5등 당첨, 내 번호: {내번호}, 로또번호 :{로또번호}')

else:
print(f'꽝, 내 번호: {내번호}, 로또번호 :{로또번호}')

import 로또한글버전 as kl

kl.로또시작()

출력
꽝, 내 번호: [24, 43, 37, 11, 7, 19], 로또번호 :[34, 4, 2, 21, 6, 43]

05_049 모듈 4 - 순열

모듈파일 - permutation.py

def getPermutationCnt(n, r):

result = 1

for n in range(n, (n-r), -1):
result = result * n

return result

실행파일

import permutation as pt

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

print(f'{numN}P{numR} : {pt.getPermutationCnt(numN, numR)}')

순열 모듈 만들기 - permutation

def getPermutationCnt(n, r):

result = 1

for n in range(n, (n-r), -1):
result = result * n

return result

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

print(f'{numN}P{numR} : {getPermutationCnt(numN, numR)}')

순열 모듈 만들기 - permutation 과정까지 보이게 하기

def getPermutationCnt(n, r):

result = 1

for n in range(n, (n-r), -1):
print('n:{}'.format(n))
result = result * n

return result

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

print(f'{numN}P{numR} : {getPermutationCnt(numN, numR)}')

순열 모듈 만들기 - permutation 과정까지 보이게 하기

def getPermutationCnt(n, r, logPrint = True):

result = 1

for n in range(n, (n-r), -1):
if logPrint: print('n:{}'.format(n))
result = result * n

return result

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

print(f'{numN}P{numR} : {getPermutationCnt(numN, numR)}')

순열 모듈 만들기 - permutation 과정까지 보이게 하기

def getPermutationCnt(n, r, logPrint = True):

result = 1

for n in range(n, (n-r), -1):
if logPrint: print('n:{}'.format(n))
result = result * n

return result

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

print(f'{numN}P{numR} : {getPermutationCnt(numN, numR, logPrint=False)}')

itertools 사용해보기

모듈파일 - permutation.py

from itertools import permutations

def getPermutations(ns, r):
pList = list(permutations(ns, r))

print(f'{len(ns)}P{r} 개수: {len(pList)} ')

for n in permutations(ns, r):
print(n, end = '')

getPermutations

실행파일

import permutation as pt

listVar = [1, 2, 3, 4, 5, 6, 7, 8]
rVar = 3

pt.getPermutations(listVar, rVar)

순열구하기 연습1

def 순열구하기(n, r):

result = 1

for n in range(n, (n-r), -1):
result *= n

return result

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))

print(f'{numN}P{numR} : {순열구하기(numN, numR)}')

순열구하기 연습2

def 순열구하기(n, r):
계산결과 = 1
for n in range(n, n-r, -1):
계산결과 = 계산결과 * n

return 계산결과

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}P{numR} : {순열구하기(numN, numR)}')

순열구하기 연습3

def 순열구하기(n, r):
result = 1

for n in range(n, n-r, -1):
result = result * n

return result

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}P{numR} : {순열구하기(numN, numR)}')

05 050 모듈 5 - 조합

조합 계산 모듈 - combination

def getCombinationCnt(n, r):

resultP = 1
resultR = 1
resultC = 1

for n in range(n, n-r, -1):
resultP *= n

for n in range(r, 0, -1):
resultR *= n

resultC = int(resultP / resultR)

return resultC

실행파일

import combination as ct

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}C{numR} : {ct.getCombinationCnt(numN, numR)}')

로그 보는 법

def getCombinationCnt(n, r):

resultP = 1
resultR = 1
resultC = 1

for n in range(n, n-r, -1):
resultP *= n
print(f'resultP: {resultP}')

for n in range(r, 0, -1):
resultR *= n
print(f'resultR: {resultR}')

resultC = int(resultP / resultR)
print(f'resultC: {resultC}')

return resultC

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}C{numR} : {getCombinationCnt(numN, numR)}')

출력
resultP: 8
resultP: 56
resultP: 336
resultR: 3
resultR: 6
resultR: 6
resultC: 56
8C3 : 56

로그 보는 법 - 볼 때, 안 볼 때 조절하는 법 - 로그프린트 매개변수 추가

def getCombinationCnt(n, r, logPrint = True):

resultP = 1
resultR = 1
resultC = 1

for n in range(n, n-r, -1):
resultP = resultP * n
if logPrint: print(f'resultP: {resultP}')

for n in range(r, 0, -1):
resultR = resultR * n
if logPrint: print(f'resultR: {resultR}')

resultC = int(resultP / resultR)
if logPrint: print(f'resultC: {resultC}')

return resultC

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}C{numR} : {getCombinationCnt(numN, numR, logPrint= True)}')

출력
꽝, 내 번호: [24, 43, 37, 11, 7, 19], 로또번호 :[34, 4, 2, 21, 6, 43]
resultP: 8
resultP: 56
resultP: 336
resultR: 3
resultR: 6
resultR: 6
resultC: 56
8C3 : 56
resultP: 8
resultP: 56
resultP: 336
resultR: 3
resultR: 6
resultR: 6
resultC: 56
8C3 : 56

iter 툴 사용해서 구하기

모듈 파일 -

from itertools import combinations

def getCombinations(n, r):
cList = list(combinations(n, r)) # -> 반복가능한 자료구조가 된다 / 그후 리스트로 캐스팅 후 변수에 담아준다
print(f'{len(n)}C{r}: {len(cList)}')

실행파일

import combination as ct

listVar = [1, 2, 3, 4, 5, 6, 7, 8]
rVar = 3
ct.getCombinations(listVar, rVar)

iter 툴 사용해서 구하기 / 로그 보기

모듈 파일 -

from itertools import combinations

def getCombinations(n, r):
cList = list(combinations(n, r)) # -> 반복가능한 자료구조가 된다 / 그후 리스트로 캐스팅 후 변수에 담아준다
print(f'{len(n)}C{r}: {len(cList)}')

for n in combinations(n, r):
print(n, end = ',')

실행파일

import combination as ct

listVar = [1, 2, 3, 4, 5, 6, 7, 8]
rVar = 3
ct.getCombinations(listVar, rVar)

itertools 연습 - itertool 이 잘 이해가 가지 않는다.

import itertools as it

a = list(it.combinations(range(1, 5), 3))
b = list(it.permutations(range(1, 5), 3))

print(a)
print(b)
print(len(a))
print(len(b))

출력
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)][(1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 4), (1, 4, 2), (1, 4, 3), (2, 1, 3), (2, 1, 4), (2, 3, 1), (2, 3, 4), (2, 4, 1), (2, 4, 3), (3, 1, 2), (3, 1, 4), (3, 2, 1), (3, 2, 4), (3, 4, 1), (3, 4, 2), (4, 1, 2), (4, 1, 3), (4, 2, 1), (4, 2, 3), (4, 3, 1), (4, 3, 2)]
4
24

iter 툴 심화 공부

list(combinations(n, r)이 어떤 형식으로 반환이 되는걸까?

from itertools import combinations

def getCombinations(n, r):
cList = list(combinations(n, r)) # -> 반복가능한 자료구조가 된다 / 그후 리스트로 캐스팅 후 변수에 담아준다
print(f'{len(n)}C{r}: {len(cList)}')

for n in combinations(n, r): # 이 부분도 잘 이해가 안되네..
print(n, end = ',')

listVar = [1, 2, 3, 4]
rVar = 3
getCombinations(listVar, rVar)

콤비네이션 첫 번째 매개 변수에 range 형태 혹은 리스트 형태로 주어지면 된다.

combinations 랑 permutations가 어떻게 반환이 되는 건지 잘 이해가 안된다. 다시 학습을 할 필요가 있다.

profile
데이터 분석가

0개의 댓글