연습문제(함수, 모듈)

윤선민·2023년 12월 7일

파이썬

목록 보기
11/14

연습문제(함수)

등비수열의 n 번째 값과 합을 출력하는 함수

def sequenceCal(n1, r, n):

    valueN = 0
    sumN = 0
    i = 1

    while i <= inputN:

        if i == 1:
            valueN = n1
            sumN += valueN
            print('{}번째 항의 값: {}'.format(i, valueN))
            print('{}번째 항까지의 합: {}'.format(i,sumN))
            i += 1
            continue

        valueN *= r
        sumN += valueN
        print('{}번째 항의 값: {}'.format(i, valueN))
        print('{}번째 항까지의 합: {}'.format(i, sumN))
        i += 1

def sequenceCal01(n1, r, n):
    valueN = n1 * (r ** (n-1))
    print('{}번째 항의 값: {}'.format(n, valueN))

    sumN = n1 * (1 - (r**n)) / (1 - r)
    print('{}번째 항까지의 합: {}'.format(n, int(sumN)))

inputN1 = int(input('a1 입력: '))
inputR = int(input('공비 입력: '))
inputN = int(input('n 입력: '))


sequenceCal(inputN1, inputR, inputN)
===================================================
a1 입력: 2
공비 입력: 3
n 입력: 5
1번째 항의 값: 2
1번째 항까지의 합: 2
2번째 항의 값: 6
2번째 항까지의 합: 8
3번째 항의 값: 18
3번째 항까지의 합: 26
4번째 항의 값: 54
4번째 항까지의 합: 80
5번째 항의 값: 162
5번째 항까지의 합: 242

연습문제(모듈)

과목별 점수를 입력하면 합격 여부를 출력하는 모듈

passOrFail.py
def examResult(s1, s2, s3, s4, s5):

    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 printFinalPassOrFail():
        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()
    printFinalPassOrFail()
-------------------------------------------------------
import passOrFail as pf

if __name__ == '__main__':
    sub1 = int(input('과목1 점수 입력: '))
    sub2 = int(input('과목2 점수 입력: '))
    sub3 = int(input('과목3 점수 입력: '))
    sub4 = int(input('과목4 점수 입력: '))
    sub5 = int(input('과목5 점수 입력: '))

    pf.examResult(sub1, sub2, sub3, sub4, sub5)
=======================================================
과목1 점수 입력: 30
과목2 점수 입력: 15
과목3 점수 입력: 100
과목4 점수 입력: 100
과목5 점수 입력: 100
총점: 345
평균: 69.0
30: Fail!
15: Fail!
100: Pass!
100: Pass!
100: Pass!
총점: 345
평균: 69.0
Final Fail!

상품 구매 개수에 따라 할인율이 결정되는 모듈

discount.py
def calculatorTotalPrice(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)]

    for g in gs:
        totalPrice += g * (1 - rate * 0.01)
    return [rate, int(totalPrice)]

def formatedNumber(n):
    return format(n, ',')
--------------------------------------------------------
import discount as dc

if __name__ == '__main__':
    flag = True
    gs = []

    while flag:
        selectNumber = int(input('상품을 구매하시겠어요? 1.구매 2.종료 입력: '))

        if selectNumber == 1:
            goods_price = int(input('상품 가격 입력: '))
            gs.append(goods_price) #구매한 상품의 가격을 리스트 gs에 추가

        elif selectNumber == 2:
            result = dc.calculatorTotalPrice(gs)
            flag = False

    print(f'할인율: {result[0]}%')
    print(f'합계: {dc.formatedNumber(result[1])}원')
====================================================================
상품을 구매하시겠어요? 1.구매 2.종료 입력: 1
상품 가격 입력: 10000
상품을 구매하시겠어요? 1.구매 2.종료 입력: 1
상품 가격 입력: 1500
상품을 구매하시겠어요? 1.구매 2.종료 입력: 1
상품 가격 입력: 26000
상품을 구매하시겠어요? 1.구매 2.종료 입력: 1
상품 가격 입력: 9870
상품을 구매하시겠어요? 1.구매 2.종료 입력: 2
할인율: 20%
합계: 37,896원

로또 모듈을 만들기

lotto.py
import random

userNums = []; randNums = []; collNums = []
randBonuNum = 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 setBonuNum():
    global randBonuNum

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

def getBonuNum():
    return randBonuNum

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(f'1등 담첨!!')
        print(f'번호: {collNums}')

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

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

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

    if len(collNums) == 3:
        print(f'5등 담첨!!')
        print(f'번호: {collNums}')

    else:
        print('아쉽습니다. 다음 기회에~')
        print(f'기계 번호: {randNums}')
        print(f'보너스 번호: {randBonuNum}')
        print(f'선택 번호: {userNums}')
        print(f'일치 번호: {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()
    setBonuNum()

    lottoResult()
--------------------------------------------------
import lotto as lt

lt.startLotto()
=======================
번호(1~45) 입력: 2
번호(1~45) 입력: 8
번호(1~45) 입력: 16
번호(1~45) 입력: 18
번호(1~45) 입력: 32
번호(1~45) 입력: 34
아쉽습니다. 다음 기회에~
기계 번호: [19, 29, 13, 36, 37, 1]
보너스 번호: 10
선택 번호: [2, 8, 16, 18, 32, 34]
일치 번호: []

순열 계산 모듈

permutaion.py
def getPermutaionCnt(n, r):

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

    return result
--------------------------------------------------------
import permutaion as pt

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

print(f'{numN}P{numR}: {pt.getPermutaionCnt(numN, numR)}')
=================================================================
numN 입력: 7
numR 입력: 5
7P5: 2520

조합 계산 모듈

combination.py
def getCombinationCnt(n, r):

    resultP = 1
    resultR = 1
    resultC = 1

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

    for n in range(r, 0 , -1):
        resultR= 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)}')

수입과 공과금을 입력하면 공과금 총액과 수입 대비 공과금 비율을 계산하는 모듈

setIncome(ic) 함수:
이 함수는 매개변수 ic를 받아서 전역 변수 income에 해당 값을 할당하는 역할
예를 들어, setIncome(50000)을 호출하면 전역 변수 income은 50000으로 설정됨

getIncome() 함수:
이 함수는 전역 변수 income의 값을 반환하는 역할
예를 들어, getIncome()을 호출하면 전역 변수 income의 현재 값이 반환

[예]
setIncome(50000) # income 변수에 50000을 설정
print(getIncome()) # 50000을 출력

utilityBill.py
income = 0
waterPrice = 0; electricPrice = 0; gasPrice = 0

def setIncome(ic):
    global income #global은 전역변수라 함수외에서도 유효! > 전역변수 강의 다시보기
    income = ic
def getIncome():
    return income

def setWaterPrice(wp):
    global waterPrice
    waterPrice = wp

def setElectricPrice(ep):
    global electricPrice
    electricPrice = ep

def setGasPrice(gp):
    global gasPrice
    gasPrice = gp

def getUtilityBill():
    result = waterPrice + electricPrice + gasPrice
    return result

def getUtilityBillRate():
    result = getUtilityBill() / getIncome() * 100
    return round(result, 2)

def formatedNumber(n):
    return format(n, ',')
----------------------------------------------------------
import utilityBill as ub

inputIncome = int(input('수입 입력: '))
ub.setIncome(inputIncome)

inputWaterPrice = int(input('수도요금 입력: '))
ub.setWaterPrice(inputWaterPrice)

inputElectricPrice = int(input('전기요금 입력: '))
ub.setElectricPrice(inputElectricPrice)

inputGasPrice = int(input('가스요금 입력: '))
ub.setGasPrice(inputGasPrice)

print(f'공과금: {ub.formatedNumber(ub.getUtilityBill())}원')
print(f'수입 대비 공과금 비율: {ub.getUtilityBillRate()}%')
==================================================================
수입 입력: 3000000
수도요금 입력: 15000
전기요금 입력: 17500
가스요금 입력: 125000
공과금: 157,500원
수입 대비 공과금 비율: 5.25%

다음과 같이 패키지와 모듈을 만들고 연산 결과를 출력해 보자

basic_operator.py
def add(n1, n2):
    return round(n1 + n2, 2)

def sub(n1, n2):
    return round(n1 - n2, 2)

def mul(n1, n2):
    return round(n1 * n2, 2)

def div(n1, n2):
    return round(n1 / n2, 2)
--------------------------------
developer_operator.py
def mod(n1, n2):
    return round(n1 % n2, 2)

def flo(n1, n2):
    return round(n1 // n2, 2)

def exp(n1, n2):
    return round(n1 ** n2, 2)
--------------------------------
circle_area.py
def calCircleArea(r):
    return round(r ** 2 * 3.14, 2)
-------------------------------------
triangle_square_area.py
def calTriangleArea(w, h):
    return round(w * h / 2, 2)

def calSquareArea(w, h):
    return round(w * h, 2)
-----------------------------------------
from arithmetic import basic_operator as bo #arithmetic 패키지에서 불러왕
from arithmetic import developer_oerator as do

from shape import triangle_square_area as tsa #shape 패키지에서 불러왕
from shape import circle_area as ca


inputNumber1 = float(input('숫자1 입력: '))
inputNumber2 = float(input('숫자2 입력: '))

print(f'{inputNumber1} + {inputNumber2} = {bo.add(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} - {inputNumber2} = {bo.sub(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} * {inputNumber2} = {bo.mul(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} / {inputNumber2} = {bo.div(inputNumber1, inputNumber2)}')

print(f'{inputNumber1} % {inputNumber2} = {do.mod(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} // {inputNumber2} = {do.flo(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} ** {inputNumber2} = {do.exp(inputNumber1, inputNumber2)}')


inputWidth = float(input('가로 길이 입력: '))
inputHeight = float(input('세로 길이 입력: '))

print(f'삼각형 넓이: {tsa.calTriangleArea(inputWidth, inputHeight)}')
print(f'사각형 넓이: {tsa.calSquareArea(inputWidth, inputHeight)}')

inputRadius = float(input('반지름 입력: '))
print(f'사각형 넓이: {ca.calCircleArea(inputRadius)}')
====================================================================
from arithmetic import basic_operator as bo
from arithmetic import developer_oerator as do

from shape import triangle_square_area as tsa
from shape import circle_area as ca


inputNumber1 = float(input('숫자1 입력: '))
inputNumber2 = float(input('숫자2 입력: '))

print(f'{inputNumber1} + {inputNumber2} = {bo.add(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} - {inputNumber2} = {bo.sub(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} * {inputNumber2} = {bo.mul(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} / {inputNumber2} = {bo.div(inputNumber1, inputNumber2)}')

print(f'{inputNumber1} % {inputNumber2} = {do.mod(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} // {inputNumber2} = {do.flo(inputNumber1, inputNumber2)}')
print(f'{inputNumber1} ** {inputNumber2} = {do.exp(inputNumber1, inputNumber2)}')


inputWidth = float(input('가로 길이 입력: '))
inputHeight = float(input('세로 길이 입력: '))

print(f'삼각형 넓이: {tsa.calTriangleArea(inputWidth, inputHeight)}')
print(f'사각형 넓이: {tsa.calSquareArea(inputWidth, inputHeight)}')

inputRadius = float(input('반지름 입력: '))
print(f'사각형 넓이: {ca.calCircleArea(inputRadius)}')

이 글은 제로베이스 데이터 분석 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.


연습문제를 따라하기 어려워서 따라만하다 이제야 조금씩 코드한줄, 한줄의 의미를 이해해간다..!
문제만 보고 바로 코드를 생각해내진 못하지만 해설의 의미도 모르다가 조금씩 해석이 되니 점점 재밌어진다. 아직도 어려운게 많지만 이론으로 접하던 개념을 문제를 풀며 해석하니 앞선 수업 내용관 연결되어 재밌어지는것같다. 앞으로 남은건 문제를 보자마자 어떤 코드로 풀어봐야될지 바로 떠오를 수 있게 연습하자!
한 문제당 시간이 많이 걸리지만 익숙해지면 빨라질거야..!💡

0개의 댓글