[데이터사이언스12기-스터디노트]파이썬(23.02.08.)

도윤수·2023년 2월 8일
0

Python스터디노트

목록 보기
7/16
post-thumbnail

📝스터디노트 7일차 범위

> 파이썬 중급 문제풀이6(함수) ~ 모듈(1~2)

📖 함수6 등비수열, 등비수열의 합 구하기

어제는 초항에서 공차만큼 커지는 수를 보는 등차수열이었다.
오늘은 초항에서 공비만큼 커지는 수를 보는 등비수열이다!!

# 출력물 만들기(등비 수열의 합)
# 등비 수열(일반항) 공식: 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도 잡아내는데 혼자 짜라그러면 머리만 복잡하고 손이 안움직인다... 연습만이 살길이다.

📖 모듈1 시험점수를 입력받아 Pass or Fail 출력하기.

여태 선언과 출력을 한 파일에서 했다면 지금부터는 모듈따로 실행따로다.
우선 과목별 점수로 합격 여부를 출력하는 모듈을 보면,

# 과목별 점수로 합격 여부 출력하는 모듈
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()
  1. 매개변수로 5과목을 받을 수 있게 준비해둔다.
  2. 평균점수 합격커트, 최저점수를 선언하고 초기화 해준다.
  3. 함수안의 함수로 전체 총점, 전체 평균, 과목별 합격/불합격 여부, 최종 합격/불합격 여부를 선언해준다.
  4. 마지막에 결과물에서 원하는 서식에 맞게 평균, 과목별 합불, 최종 합불을 호출한다.

우선 이부분은 강의를 들으면서 따라했는데 중간에 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해서 사용한다면 무엇인가 따로 써줄 필요없이 값을 넣어서 돌리면 끝이다. 아니라면 위의 코드처럼 무엇인가 토를 달아야한다.

📖 모듈2 구매갯수에 따라 할인율, 가격 출력하기.

이 문제도 처음에 머리속으로 구상하고 시작했는데 엉뚱한 결과만 나와서 따라했다.
우선 이 문제는 몇개나 살지 모르는 상황이여서 매개변수를 튜플로 담으려 했었는데 중간에 멈추고 강사님 방식으로 따라했다. ★ 꼭 처음 생각했던 (*변수)방식으로 다시 짜봐야겠다(메모..)

# 상품 구매 개수에 따라 할인율이 결정되는 모듈을 만들자.
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 써도 됨.
  1. discount 지만 as dc를 사용해 dc로 치환해준다.
  2. flag에 True(1)을 넣어주고 while에 flag를 두어 False가 되기 전까지 돌아갈 수 있도록 한다.
  3. while 이 도는 동안 계속 1. 구매인지 2. 종료인지를 입력받는다. 당연히 int로 캐스팅
    1. 구매를 선택하면 가격 입력받는 단계로 넘어가고 goods인 리스트 gs에 append 함수를 통해 담아준다.
  4. 만약 2. 종료를 선택하면 바로 결과값을 반환하고, flag를 False로 바꿔주며 while을 탈출한다.
  5. 이전에 만들었던 formatedNumber를 사용해도 되지만, 내가 사용하기 편했던 (숫자:,)를 사용해서 금액을 이쁘게 출력해주었다.

🔥🔥바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자🔥🔥

profile
DataScience를 하고 싶은 DoIT

0개의 댓글