오늘의 한 일
- python 강의 5일차
- 클래스 활용하기 과제
- 백준 알고리즘 문제 풀이 - 기본 수학1
python 강의 5일차
try / exception을 활용한 에러 처리
- python에서는 try / except 문법을 사용해 에러가 발생했을 때 처리를 해줄수 있습니다.
number = "num"
try: # try 구문 안에서 에러가 발생할 경우 except로 넘어감
number = int(number) # "num"을 숫자로 바꾸는 과정에서 에러 발생
except: # 에러가 발생했을 때 처리
print(f"{number}은(는) 숫자가 아닙니다.")
- 에러 종류에 따라 다른 로직 처리
number = input()
try:
int(number)
10 / number
except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
print(f"{number}은(는) 숫자가 아닙니다.")
except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
print("0으로는 나눌수 없습니다.")
except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
print(f"예상하지 못한 에러가 발생했습니다. error : {e}")
# except 문법 또한 if / elif와 같이 연달아서 작성할 수 있습니다.
stacktrace의 이해
- stacktrace란?
stacktrace는 python 뿐만이 아닌 대부분의 개발 언어에서 사용되는 개념입니다.
에러가 발생했을 때 에러가 발생 한 위치를 찾아내기 위해 호출 된 함수의 목록을 보여주고
개발자는 stacktrace를 따라가며 에러가 발생한 위치를 추적할 수 있습니다.
- 예제 코드 보기
def 집까지_걸어가기():
print(error) # 선언되지 않은 변수를 호출했기 때문에 에러 발생
def 버스_탑승():
집까지_걸어가기()
def 환승():
버스_탑승()
def 지하철_탑승():
환승()
def 퇴근하기():
지하철_탑승()
퇴근하기()
"""
Traceback (most recent call last):
File "sample.py", line 17, in <module>
퇴근하기()
File "sample.py", line 15, in 퇴근하기
지하철_탑승()
File "sample.py", line 12, in 지하철_탑승
환승()
File "sample.py", line 9, in 환승
버스_탑승()
File "sample.py", line 5, in 버스_탑승
집까지_걸어가기()
File "sample.py", line 2, in 집까지_걸어가기
print(error)
NameError: name 'error' is not defined. Did you mean: 'OSError'?
"""
축약식(Comprehension)
- 축약식이란?
축약식은 긴 코드를 간략하게 줄일수 있다는 장점이 있지만, 남용할 경우 가독성이
떨어지고 추후 코드 관리가 힘들수 있기 때문에 필요할 때만 사용하는 것을 권장합니다.
list, set, tuple, dict 자료형이 축약식을 지원합니다.
기본적인 구조는 똑같으며, 어떤 괄호 기호를 사용하는지 / 어떤 형태로 사용하는지에
따라 저장되는 자료형이 달라집니다.
축약식은 모두 동일한 구조를 가지고 있기 때문에 한 가지 자료형에 익숙해지면 다른
자료형에도 적용해서 사용할 수 있습니다.
- list / tuple / set 축약식 활용법
# 기본적인 활용 방법
# [list에 담길 값 for 요소 in 리스트]
numbers = [x for x in range(5)] # [0, 1, 2, 3, 4]
# 조건문은 축약식 뒷부분에 작성하며, 축약식이 True인 경우 list에 값이 담긴다.
even_numbers = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
# 아래와 같이 활용할 수도 있다.
people = [
("lee", 32),
("kim", 23),
("park", 27),
("hong", 29),
("kang", 26)
]
average_age = sum([x[1] for x in people]) / len(people)
print(average_age) # 27.4
#list 축약식의 []를 ()혹은 {}로 바꿔주면 tuple, set 축약식을 사용하실수 있습니다.
- dictionary 축약식 활용법
# dictionary 축약식의 구조는 list와 동일하지만, key / value 형태로 지정해야 합니다.
people = [
("lee", 32, "man"),
("kim", 23, "man"),
("park", 27, "woman"),
("hong", 29, "man"),
("kang", 26, "woman")
]
people = {name: {"age": age, "gender": gender} for name, age, gender in people}
print(people)
# result print
"""
{
'lee': {'age': 32,
'gender': 'man'},
'kim': {'age': 23,
'gender': 'man'},
'park': {'age': 27,
'gender': 'woman'},
'hong': {'age': 29,
'gender': 'man'},
'kang': {'age': 26,
'gender': 'woman'}
}
"""
lambda / map / filter / sort 활용하기
- lambda 함수란?
python에서 lambda 함수는 다른 말로 익명 함수(anonymous function)라고도 불립니다.
lambda 함수는 주로 map / filter / sort 함수와 함께 사용됩니다.
- map 함수 활용해보기
# map은 함수와 리스트를 인자로 받아 리스트의 요소들로 함수를 호출해줍니다.
string_numbers = ["1", "2", "3"]
integer_numbers = list(map(int, string_numbers))
print(integer_numbers) # [1, 2, 3]
# map 함수를 사용하지 않는 경우 아래와 같이 구현할 수 있습니다.
string_numbers = ["1", "2", "3"]
integer_numbers = []
for i in string_numbers:
integer_numbers.append(int(i))
print(integer_numbers) # [1, 2, 3]
# list 축약식으로도 동일한 기능을 구현할 수 있습니다.
# map과 list 축약식 중 어떤걸 써야 할지 고민된다면 이 글을 읽어보시는것을 추천합니다.
string_numbers = ["1", "2", "3"]
integer_numbers = [int(x) for x in string_numbers]
print(integer_numbers) # [1, 2, 3]
# map 함수와 lambda 함수를 함께 사용하면 더 다채로운 기능을 구현할 수 있습니다.
numbers = [1, 2, 3, 4]
double_numbers = list(map(lambda x: x*2, numbers))
print(double_numbers) # [2, 4, 6, 8]
- filter 함수 활용해보기
# filter 함수는 map과 유사한 구조를 가지고 있으며, 조건이 참인 경우 저장합니다.
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = list(filter(lambda x: x%2 == 0, numbers))
print(even_numbers) # [2, 4, 6, 8]
# filter 함수 또한 list 축약식으로 동일한 기능을 구현할 수 있습니다.
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = [x for x in numbers if x%2 == 0]
print(even_numbers) # [2, 4, 6, 8]
- sort 함수 활용해보기
# sort 함수를 사용하면 list를 순서대로 정렬할 수 있습니다.
numbers = [5, 3, 2, 4, 6, 1]
numbers.sort()
print(numbers) # [1, 2, 3, 4, 5, 6]
# sort와 lambda 함수를 같이 사용하면 복잡한 구조의 list도 정렬할 수 있습니다.
people = [
("lee", 32),
("kim", 23),
("park", 27),
("hong", 29),
("kang", 26)
]
# 나이 순으로 정렬하기
people.sort(key=lambda x: x[1])
print(people)
# result print
"""
[
("kim", 23),
("kang", 26),
("park", 27),
("hong", 29),
("lee", 32)
]
"""
클래스 활용하기 과제
try - except 부분을 어디에 넣어야하나 고민을 많이했는데 출력부분에 넣어도 작동하는것을 팀원들과 함께 알아내서 깔끔하게 정리할 수 있었다.
튜터님의 조언에 따라 나눗셈에만 적용되는 에러인 ZeroDivisionError는 나눗셈 함수에서만 적용되도록 try except를 한번 더 쓰는것으로 의견을 맞췄다.
백준 알고리즘 문제 풀이 - 기본 수학 1
난이도가 수직상승해버린 느낌, 이제 코딩은 기본으로 깔고 로직을 구상하는게 핵심이 된 것 같다.