> 파이썬 중급 문제풀이6(함수) ~ 모듈(1~2)
어제는 초항에서 공차만큼 커지는 수를 보는 등차수열이었다.
오늘은 초항에서 공비만큼 커지는 수를 보는 등비수열이다!!
# 출력물 만들기(등비 수열의 합)
# 등비 수열(일반항) 공식: an = a1 * r^(n-1)
# 등비 수열(합) 공식: sn = a1 * (1-r^n) / (1-r)
def geoSequence(a, r, n): # 초항, 공비, n항
# 먼저 선언해준다.
valueN = 0 # n항의 값
sumN = 0 # n항까지 합의 값
i = 1
while i <= n:
if i == 1:
valueN = a
sumN = valueN
print(f'{i}번째 항의 값: {valueN}')
print(f'{i}번째 항까지 합의 값: {sumN}')
i += 1 # 무한루프 방지 중요!!!!
continue
valueN *= r
sumN += valueN
print(f'{i}번째 항의 값: {valueN}')
print(f'{i}번째 항까지 합의 값: {sumN}')
i += 1
inputA = int(input('초항 입력: '))
intputR = int(input('공비 입력: '))
intputN = int(input('n번쨰항 입력: '))
geoSequence(inputA, intputR, intputN)
등차수열과 다른부분은 r 만큼 커지던게 r 배 만큼 커진다는거? 그래서 기억을 더듬어 혼자 짜보려 했지만 안된다 아직... 우선 강의를 들으며 이해하면서 따라해봤다.
1. n항의 값, n항까지의 값을 선언하고 초기화 해주고, i=1 까지 해주고 while문으로 들어간다.
★ while문은 만들자마자 탈출구를 만들어 놓자!
2. 현재 항의 값에 공비를 곱한 값을 현재 항의 값에 넣어주고, 현재 항 까지의 합 값에 계속 더해준다.
3. 입력값은 당연히 int로 캐스팅해서 받아줘야 계산이 들어갈 수 있다.
강의를 들으면서 따라치면 이해도되고 중간중간 실행했을 때 나는 error도 잡아내는데 혼자 짜라그러면 머리만 복잡하고 손이 안움직인다... 연습만이 살길이다.
여태 선언과 출력을 한 파일에서 했다면 지금부터는 모듈따로 실행따로다.
우선 과목별 점수로 합격 여부를 출력하는 모듈을 보면,
# 과목별 점수로 합격 여부 출력하는 모듈
def exampleResult(s1, s2, s3, s4, s5):
# 매개변수가 몇개가 들어올지 모를때 튜플로 만들어서 *s 형태로 사용하는 것으로 한번 짜보기.
passAvgScore = 60; limitScore = 40;
def getTotal():
totalScore = s1 + s2 + s3 + s4 + s5
print(f'총점: {totalScore}')
return totalScore
def getAverage():
avg = getTotal() / 5
print(f'평균: {avg}')
return avg
def printPassOrFail():
print(f'{s1}: pass') if s1 >= limitScore else print(f'{s1}: Fail')
print(f'{s2}: pass') if s2 >= limitScore else print(f'{s2}: Fail')
print(f'{s3}: pass') if s3 >= limitScore else print(f'{s3}: Fail')
print(f'{s4}: pass') if s4 >= limitScore else print(f'{s4}: Fail')
print(f'{s5}: pass') if s5 >= limitScore else print(f'{s5}: Fail')
def printFainalPassOrFail():
if getAverage() >= passAvgScore:
if s1 >= limitScore and s2 >= limitScore and s3 >= limitScore and s4 >= limitScore and s5 >= limitScore:
print('Final Pass!!')
else:
print('Final Fail!!')
else:
print('Final Fail!!')
getAverage()
printPassOrFail()
printFainalPassOrFail()
- 매개변수로 5과목을 받을 수 있게 준비해둔다.
- 평균점수 합격커트, 최저점수를 선언하고 초기화 해준다.
- 함수안의 함수로 전체 총점, 전체 평균, 과목별 합격/불합격 여부, 최종 합격/불합격 여부를 선언해준다.
- 마지막에 결과물에서 원하는 서식에 맞게 평균, 과목별 합불, 최종 합불을 호출한다.
우선 이부분은 강의를 들으면서 따라했는데 중간에 getAverage에서 return을 하지않아 값이 넘어가지 못해서 error가 났었다. 항상 ★ return이 필요하다면 까먹지말고 해주기!!!
자, 이제 모듈을 만들었다면 실행파일을 만들어준다.
import passOrFail as pf # 너무 길어서 치환
if __name__ == '__main__': # name 전역변수가 main과 같다면
sub1 = int(input('과목1 점수 입력: '))
sub2 = int(input('과목2 점수 입력: '))
sub3 = int(input('과목3 점수 입력: '))
sub4 = int(input('과목4 점수 입력: '))
sub5 = int(input('과목5 점수 입력: '))
pf.exampleResult(sub1, sub2, sub3, sub4, sub5)
많은 내용이 입력되고 출력되는 코드치고 아주 간결해서 좋긴하다...
1. import로 앞서 만들어둔 passOrFail 모듈을 불러오고, 이름이 너무 기니까 as를 사용해서 pf로 치환.
2. 처음보는 name == 'main' 이라는 문법이 나왔는데, 다른언어와 달리 파이썬만의 특징 때문에 있는부분이다.
‣ 파이썬은 타 언어와 달리 main이 존재하지 않는다.
‣ 파이썬은 들여쓰기로만 level을 나누어 안인지 밖인지를 구분한다.
‣ 파이썬은 타 언어와 달리 동시에 번역하는 인터프리터 언어이다. 그래서 import해서 사용한다면 무엇인가 따로 써줄 필요없이 값을 넣어서 돌리면 끝이다. 아니라면 위의 코드처럼 무엇인가 토를 달아야한다.
이 문제도 처음에 머리속으로 구상하고 시작했는데 엉뚱한 결과만 나와서 따라했다.
우선 이 문제는 몇개나 살지 모르는 상황이여서 매개변수를 튜플로 담으려 했었는데 중간에 멈추고 강사님 방식으로 따라했다. ★ 꼭 처음 생각했던 (*변수)방식으로 다시 짜봐야겠다(메모..)
# 상품 구매 개수에 따라 할인율이 결정되는 모듈을 만들자.
def discountPurchase(gs):
if len(gs) <= 0:
print('구매 상품이 없습니다.')
return
rate = 25
totalPrice = 0
rates = {1:5, 2:10, 3:15, 4:20} # 딕셔너리로 갯수당 할인율을 담는다.
if len(gs) in rates:
rate = rates[len(gs)] # rates안에 있는 갯수라면 5~20퍼 아니라면 25퍼
for g in gs:
totalPrice += g * (1 - rate * 0.01)
return [rate, int(totalPrice)]
def fomatedNumber(n):
return format(n, ',')
할인율 밑 총 가격을 계산해줄 모듈이다.
1. 상품을 몇개 살지 모르니 len으로 카운트하고 만약 담은 물건이 없을 때를 먼저 만들어줬다.
2. rates (할인율)을 딕셔너리에 담아서 1개(5%)일때~4개(20%)일때까지 담아준다.
‣ 딕셔너리는 키(key)값, 벨류(value) 값으로 정의되는 방식이다. 튜플이나 리스트와는 달리 키 값을 입력하면 벨류 값을 출력할 수 있고, 추가 및 제거가 가능하다.
3. 할인율과 금액을 반환한다.
4. 💻 for g in gs:
totalPrice += g (1 - rate 0.01) 이부분이 아직 잘 이해가 안간다...
위 내용을 가지고 출력할 파일이다.
# 상품 구매 개수에 따라 할인율이 결정되는 모듈을 만들자.
import discount as dc
if __name__ == '__main__': # 전역변수 -> main과 같다면 실행파일
flag = True #flag에 True가 들어있으면 while에서 반복할 수 있음
gs = []
while flag:
selectNumber = int(input('1.구매, 2.종료'))
if selectNumber == 1:
goods_price = int(input('상품 가격 입력: '))
gs.append(goods_price) #append 리스트에? 담다.
elif selectNumber == 2:
result = dc.discountPurchase(gs)
flag = False
print(f'할인율: {result[0]}%')
print(f'합계: {result[1]:,}원') #fomatedNumber 써도 됨.
- discount 지만 as dc를 사용해 dc로 치환해준다.
- flag에 True(1)을 넣어주고 while에 flag를 두어 False가 되기 전까지 돌아갈 수 있도록 한다.
- while 이 도는 동안 계속 1. 구매인지 2. 종료인지를 입력받는다. 당연히 int로 캐스팅
- 구매를 선택하면 가격 입력받는 단계로 넘어가고 goods인 리스트 gs에 append 함수를 통해 담아준다.
- 만약 2. 종료를 선택하면 바로 결과값을 반환하고, flag를 False로 바꿔주며 while을 탈출한다.
- 이전에 만들었던 formatedNumber를 사용해도 되지만, 내가 사용하기 편했던 (숫자:,)를 사용해서 금액을 이쁘게 출력해주었다.
🔥🔥바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자🔥🔥