코딩일지/내일배움캠프 과제

20220914 파이썬 과제

야언 2022. 9. 14. 15:14

1. 계산기 심화

num1 = input('첫 번째 숫자를 입력 : ')
num2 = input('두 번째 숫자를 입력 : ')

class Calc:

    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def plus(self):
        try:
            result = int(self.num1) + int(self.num2)
            return result
        except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
            print(f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다.")
        except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
            print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

    def minus(self):
        try:
            result = int(self.num1) - int(self.num2)
            return result
        except ValueError: 
            print(f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다.")
        except Exception as e: 
            print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

    def multiple(self):
        try:
            result = int(self.num1) * int(self.num2)
            return result
        except ValueError: 
            print(f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다.")
        except Exception as e: 
            print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

    def divide(self):
        try:
            result = int(self.num1) / int(self.num2)
            return result
        except ValueError: 
            print(f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다.")
        except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
            print("0으로는 나눌수 없습니다.")
        except Exception as e: 
            print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

calc = Calc(num1, num2)

print(calc.plus()) # 더한 값
print(calc.minus()) # 뺀 값
print(calc.multiple()) # 곱한 값
print(calc.divide()) # 나눈 값

try except를 클래스 바로 아래항목에 넣으려니 에러가 나서 일단 함수별로 집어넣었다.

작동은 하는데 뭔가 훨씬 더 깔끔하게 만들 수 있을거같은데..씁 

 

보강한 부분

num1 = input('첫 번째 숫자를 입력 : ')
num2 = input('두 번째 숫자를 입력 : ')

class Calc:

    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def plus(self):
        try:
            result = int(self.num1) + int(self.num2)
            return result
        except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
            return f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다."
        except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
            return f"예상하지 못한 에러가 발생했습니다. error : {e}"

    def minus(self):
        try:
            result = int(self.num1) - int(self.num2)
            return result
        except ValueError: 
            return f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다."
        except Exception as e: 
            return f"예상하지 못한 에러가 발생했습니다. error : {e}"

    def multiple(self):
        try:
            result = int(self.num1) * int(self.num2)
            return result
        except ValueError: 
            return f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다."
        except Exception as e: 
            return f"예상하지 못한 에러가 발생했습니다. error : {e}"

    def divide(self):
        try:
            result = int(self.num1) / int(self.num2)
            return result
        except ValueError:
            return f"{num1} 혹은 {num2}은(는) 숫자가 아닙니다."
        except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
            return "0으로는 나눌수 없습니다."
        except Exception as e:
            return f"예상하지 못한 에러가 발생했습니다. error : {e}"

calc = Calc(num1, num2)

print(calc.plus()) # 더한 값
print(calc.minus()) # 뺀 값
print(calc.multiple()) # 곱한 값
print(calc.divide()) # 나눈 값

print가 아니라 return값에 문자열을 추가해서 일단 깔끔하게 만들었다 ㅋㅋ 함수별로 try except 넣은건 좀 거슬리긴 하지만..

 

 

최종본

num1 = input('첫 번째 숫자를 입력 : ')
num2 = input('두 번째 숫자를 입력 : ')

class Calc:

    def set_number(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def plus(self):
        result = int(self.num1) + int(self.num2)
        return result

    def minus(self):
        result = int(self.num1) - int(self.num2)
        return result

    def multiple(self):
        result = int(self.num1) * int(self.num2)
        return result

    def divide(self):
        result = int(self.num1) / int(self.num2)
        return result

calc = Calc()
calc.set_number(num1, num2)

try:
    print(calc.plus()) # 더한 값
    print(calc.minus()) # 뺀 값
    print(calc.multiple()) # 곱한 값
    print(calc.divide()) # 나눈 값

except ValueError:  # int로 변환하는 과정에서 에러가 발생했을 떄
    print(f"{num1} 혹은 {num2} 은(는) 숫자가 아닙니다.")
except ZeroDivisionError:  # 0으로 나누면서 에러가 발생했을 때
    print("0으로는 나눌수 없습니다.")
except Exception as e:  # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
    print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

출력부분에 try exception을 적용시켜도 됐다. 하는김에 인스턴스 생성도 입출력 예제대로 set_number 함수를 만들어 사용.

 

 

 

P.S. ZeroDivisionError은 나눗셈에만 적용되는 에러이므로 전체적으로 적용시켜도 문법상 오류는 없지만 나눗셈 함수에만 적용시키는것을 권장한다 합니다

 

num1 = input('첫 번째 숫자를 입력 : ')
num2 = input('두 번째 숫자를 입력 : ')

class Calc:

    def set_number(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def plus(self):
        result = int(self.num1) + int(self.num2)
        return result

    def minus(self):
        result = int(self.num1) - int(self.num2)
        return result

    def multiple(self):
        result = int(self.num1) * int(self.num2)
        return result

    def divide(self):
        try:
            result = int(self.num1) / int(self.num2)
            return result
        except ZeroDivisionError:  # 0으로 나누면서 에러가 발생했을 때
            return "0으로는 나눌 수 없습니다"

calc = Calc()
calc.set_number(num1, num2)

try:
    print(calc.plus()) # 더한 값
    print(calc.minus()) # 뺀 값
    print(calc.multiple()) # 곱한 값
    print(calc.divide()) # 나눈 값

except ValueError:  # int로 변환하는 과정에서 에러가 발생했을 떄
    print(f"{num1} 혹은 {num2} 은(는) 숫자가 아닙니다.")
except Exception as e:  # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
    print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

 

 

정답지

class Calc:
    def set_number(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def plus(self):
        result = self.num1 + self.num2
        return result

    def minus(self):
        result = self.num1 - self.num2
        return result

    def multiple(self):
        result = self.num1 * self.num2
        return result

    def divide(self):
        try:
            result = self.num1 / self.num2
            return result
        except ZeroDivisionError:  # 0으로 나누면서 에러가 발생했을 때
            return "0으로는 나눌 수 없습니다"

while 1:
    try:
        num1 = int(input('첫 번째 숫자를 입력 : '))
        num2 = int(input('두 번째 숫자를 입력 : '))
        break
    except ValueError:  # int로 변환하는 과정에서 에러가 발생했을 떄
        print("숫자를 입력하십시오.")


calc = Calc()
calc.set_number(num1, num2)


print(calc.plus()) # 더한 값
print(calc.minus()) # 뺀 값
print(calc.multiple()) # 곱한 값
print(calc.divide()) # 나눈 값

 

 

 

 

 

 

 

2. 리스트 필터 및 정렬

 

from pprint import pprint

people = [
    ("Blake Howell", "Jamaica", 18, "aw@jul.bw"),
    ("Peter Bowen", "Burundi", 30, "vinaf@rilkov.il"),
    ("Winnie Hall", "Palestinian Territories", 22, "moci@pacivhe.net"),
    ("Alfred Schwartz", "Syria", 29, "ic@tolseuc.pr"),
    ("Carrie Palmer", "Mauritius", 28, "fenlofi@tor.aq"),
    ("Rose Tyler", "Martinique", 17, "as@forebjab.et"),
    ("Katharine Little", "Anguilla", 29, "am@kifez.et"),
    ("Brent Peterson", "Svalbard & Jan Mayen", 22, "le@wekciga.lr"),
    ("Lydia Thornton", "Puerto Rico", 19, "lefvoru@itbewuk.at"),
    ("Richard Newton", "Pitcairn Islands", 17, "da@lasowiwa.su"),
    ("Eric Townsend", "Svalbard & Jan Mayen", 22, "jijer@cipzo.gp"),
    ("Trevor Hines", "Dominican Republic", 15, "ev@hivew.tm"),
    ("Inez Little", "Namibia", 26, "meewi@mirha.ye"),
    ("Lloyd Aguilar", "Swaziland", 16, "oza@emneme.bb"),
    ("Erik Lane", "Turkey", 30, "efumazza@va.hn"),
]

# some code
people = [x for x in people if x[2] > 20]
people.sort(key=lambda x: x[2])


pprint(people)

 

 

 

조건문 축약식으로 필터링. 필터 함수를 이용했다면

people = list(filter(lambda x: x[2] > 20, people))