Ssa!
파이썬 실강 5일차! 본문
1. 클래스의 __str__메서드
class Profile():
def __init__(self, profile):
self.profile = profile
def __str__(self):
return str(self.profile)
profile = Profile({
"name":"jin",
"age":32,
})
print(profile)
str에 대해서 간단 요약하자면 def __str__은 편리성을 위해 사용되고, return 뒤에 반환값을 적어준다.print()를 일일히 입력하지 않아도 된다.( 매번 메서드를 만들어서 print()를 넣어 그 메서드를 불러왔었는데 __str__만 알면 그런 함수를 만들지 않고 출력이 가능하다!!!!!!)
2. try/exception 예외처리
아래는 기본 try/exception이다
number = "num"
#if문을 대신해서 많이 쓰게 됨
try: # try 구문 안에서 에러가 발생할 경우 except로 넘어감
number = int(number) #"num"을 숫자로 바꾸는 과정에서 에러 발생
except: #에러가 발생했을 때 처리
print(f"{number}은(는) 숫자가 아닙니다.")
#pass도 많이 쓴다. continue는 반복문에서 다음 반복문으로 넘어가라는 뜻이므로 pass와 다르다
아래는 에러 종류에 따라 다른 로직 처리를 할 수 있는 것이다. 이 try , except안에는 반복문이 들어갈 수도 있고 어떤 것들도 다 들어갈 수 있다!
while True:
number = input()
#신텍스 에러는 문법적 오류라 예외처리가 불가능함
try:
number = int(number)
print(10/number)
except ValueError: # int로 변환하는 과정에서 에러가 발생했을 때
print(f"{number}은(는) 숫자가 아닙니다.")
except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
print("0으로 나눌 수 없습니다")
except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음 -> 파이썬 pep에 나와있다!)
print(f"예상하지 못한 에러가 발생했습니다. error: {e}")
# except 문법 또한 if / elif 와 같이 연달아서 작성할 수 있습니다.
에러 종류가 몇가지 찾아보아 더 있어서 정리해본다!
| ValueError | 유효하지 않은 값을 마주 했을 때 |
| TypeError | 잘못된 유형의 값으로 작업이 수행될 경우 발생 |
| NameError | 사용하려는 변수의 이름이 아직 정의되어 있지 않을 때 발생 |
| ZeroDivisionError | 나눗셈 연산에서 어떤 수를 나누는 수가 0일 때 발생 |
| OverflowError | 산술 연산의 결과가 너무 클 때 발생 |
더 많은 에러를 찾아보려면?
https://docs.python.org/ko/3/library/exceptions.html
내장 예외 — Python 3.10.7 문서
내장 예외 파이썬에서, 모든 예외는 BaseException 에서 파생된 클래스의 인스턴스여야 합니다. 특정 클래스를 언급하는 except 절을 갖는 try 문에서, 그 절은 그 클래스에서 파생된 모든 예외 클래스
docs.python.org
3. Stacktrace의 이해
stacktrace는 python 뿐만 아니라 대부분의 개발 언어에서 사용되는 개념이다
에러가 발생했을 때 에러가 발생 한 위치를 찾아내기 위해 호출 된 함수의 목록을 보여주고
개발자는 stacktrace를 따라가며 에러가 발생한 위치를 추적할 수 있다
이 개념을 제대로 알고 있으면 디버깅 할 때 유용하다. 보통 대규모의 프로젝트를 진행할 때 자주 마주치게 된다. 아래의 터미널에 오류를 보면 단계별로 살펴보면된다. 그러면 어디서 에러가 발생했는지 찾아볼 수 있다!
def 집까지_걸어가기():
print(error)#선언되지 않은 변수를 호출했기 때문에 에러 발생
def 버스_탑승():
집까지_걸어가기()
def 환승():
버스_탑승()
def 지하철_탑승():
환승()
def 퇴근하기():
지하철_탑승()
퇴근하기()
# Traceback (most recent call last):
# File "c:\Users\wogur\OneDrive\바탕 화면\코드\Sparta_bootcamp\python basic\statcktrace의 이해\stacktrace.py", line 12, in <module>
# 퇴근하기()
# File "c:\Users\wogur\OneDrive\바탕 화면\코드\Sparta_bootcamp\python basic\statcktrace의 이해\stacktrace.py", line 10, in 퇴근하기
# 지하철_탑승()
# File "c:\Users\wogur\OneDrive\바탕 화면\코드\Sparta_bootcamp\python basic\statcktrace의 이해\stacktrace.py", line 8,
# in 지하철_탑승
# 환승()
# File "c:\Users\wogur\OneDrive\바탕 화면\코드\Sparta_bootcamp\python basic\statcktrace의 이해\stacktrace.py", line 6,
# in 환승
# 버스_탑승()
# File "c:\Users\wogur\OneDrive\바탕 화면\코드\Sparta_bootcamp\python basic\statcktrace의 이해\stacktrace.py", line 4,
# in 버스_탑승
# 집까지_걸어가기()
# File "c:\Users\wogur\OneDrive\바탕 화면\코드\Sparta_bootcamp\python basic\statcktrace의 이해\stacktrace.py", line 2,
# in 집까지_걸어가기
# print(error)#선언되지 않은 변수를 호출했기 때문에 에러 발생
# NameError: name 'error' is not defined. Did you mean: 'OSError'?
4. 축약식(comprehension)
축약식은 긴 코드를 간략하게 줄일 수 있다는 장점이 있지만, 남용할 경우 가독성이 떨어지고
추후 코드 관리가 힘들 수 있기 때문에 필요할 때만 사용하는 것을 권장한다
list, set, tuple, dict 자료형이 축약식을 지원한다.
기본적인 구조는 똑같으며, 어떤 괄호 기호를 사용하는지 / 어떤 형태로 사용하는지에
따라 저장되는 자료형이 달라진다.
축약식은 모두 동일한 구조를 가지고 있기 때문에 한 가지 자료형에 익숙해지면 다른 자료형에도
적용해서 사용할 수 있다.
list/set/tuple의 축약식 형태인데 보통 list의 축약식을 많이 쓴다! (dict축약식은 잘 쓰이지 않아 먼저 list를 익숙해진다음 쓸 필요가 있을 때 찾아서 쓰자!)
#[list에 담길 값 for 요소 in 리스트]
numbers = [x for x in range(5)] #[0,1,2,3,4]
numbers = [x * 2 for x in range(5)] #0,2,4,6,8]
numbers = [2 for _ in range(5)] #[2,2,2,2,2]
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)
]
# sum_age = 0
# for i in people:
# sum_age += i[1]
# avg_age = sum_age / len(people)
# print(avg_age)
avg_age = sum([x[1] for x in people]) / len(people) #x는 튜플이 담기며 x의 1번째 인덱스 즉 나이가 담긴다.
print(avg_age)
# #input을 이용한 것
# count = int(input())
# user_inputs = [input() for x in range(count)]
# print(user_inputs)
또한 리스트안에 input()을 넣어 리스트를 작성할 수도 있다!
#input을 이용한 것
count = int(input())
user_inputs = [input() for x in range(count)]
print(user_inputs)
5. lambda / map / filter / sort 활용하기
python 에서 람다함수는 다른말로 익명함수라고도 불린다
람다함수는 주로 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))
# double_numbers = [x*2 for x in numbers] # list축약식을 사용했을 때의 코드 위와 같은 코드
print(double_numbers) #[2,4,6,8]
filter활용(filter 또한 list 축약식으로 처리가 가능하다)
#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]
#list 축약식으로 이렇게 표현할 수도 있다!
people = [
("lee", 32),
("kim", 23),
("park", 27),
("hong", 29),
("kang", 26)
]
people = [x for x in people if x[1] >= 30]
print(people)
sort활용(이것만은 list축약식으로 표현할 수 없다! 제대로 익혀둬야한다!!)
# sort함수를 사용하면 list를 순서대로 정렬할 수 있다
numbers = [5,3,2,4,6,1]
numbers.sort()
print(numbers) # [1,2,3,4,5,6]
# 역순으로도 돌릴 수 있다.
numbers = [5,3,2,4,6,1]
numbers.sort(reverse=True)
print(numbers) # [6,5,4,3,2,1]
#sort와 lambda를 활용한 예제
people = [
("lee", 32),
("kim", 23),
("park", 27),
("hong", 29),
("kang", 26)
]
#나이 순으로 정렬하기
people.sort(key=lambda x: x[1])#, reverse=True역순 정렬도 가능) #key(어떤 기준으로 정렬할 것인가)라는 옵션에서 lambda를 넣을 수 있다.
print(people)
#result print
# [('kim', 23), ('kang', 26), ('park', 27), ('hong', 29), ('lee', 32)]
#나이와 이름순으로 정렬하기!
people = [
("lee", 32),
("lee", 31),
("lee", 29),
("lee", 19),
("kim", 23),
("park", 27),
("hong", 29),
("kang", 26)
]
people.sort(key=lambda x: (x[0],x[1])) #튜플을 감싸서 x[0]을 먼저 나타내주고 그다음 x[1]을 기준으로 나타낸다
느낀점)
오늘 개념 배웠던 것들이 너무 머릿속에 많이 들어와 어지럽다. 천천히 익혀 내것으로 만들 시간이 좀 필요할 것 같다. 특히 lambda 부분이 잘 활용을 못할 정도인 것 같다. 다른 부분은 어느정도 이해가 되고 활용이 되겠지만 그 부분만큼은 제대로 정리가 되지않아 예제를 좀 더 보고 모르는 부분은 유튜브를 찾아보아 더 공부해야할 것 같다! 내가 모르는 부분을 빠르게 찾을 수 있어 좋은 강의였다!
'언어 > python' 카테고리의 다른 글
| 파이썬 실강 6일차! (0) | 2022.09.15 |
|---|---|
| 파이썬 심화 문법 과제 (0) | 2022.09.14 |
| 파이썬 클래스 과제 (0) | 2022.09.14 |
| 파이썬 실강 4일차! (0) | 2022.09.13 |
| 파이썬 과제 숫자야구! 튜터님! (0) | 2022.09.13 |