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))